(本节笔记的详细实验代码在这里)
1. 基本概念
1.1 ——C库函数
独立于具体的操作系统,无论是在Linux、Windows或其他OS都能使用C库函数,提高了程序的移植性。
1.2 ——流
系统(程序)对文件(内存、网络连接或某个设备)进行数据的读写操作。
1.3 ——文件指针
类似于系统调用中的文件描述符FD,在库函数中使用FILE类型来表示一个打开的文件,这个类型中包含了管理文件流的信息,而指向该类型的指针 FILE* 则被称为文件指针。
2. 文件操作函数
2.1 打开文件
函数名:
fopen
函数原型:
FILE *fopen(const char *path, const char *mode);
函数功能:
打开文件
所属头文件:
<stdio.h>
返回值:
成功:返回文件指针 失败:返回空指针
参数说明:
path:要打开的文件名(含路径),如:“/home/hello.c”
mode:打开文件的方式,man fopen:
r 以制度方式打开
r+ 以可读可写的方式打开(文件已存在)
w 清空文件或创建一个只写文件
w+ 以可读可写方式打开,如果不存在则创建(文件不存在),如果文件存在,则打开并清空文件
范例代码:
#include <stdio.h>
int main(int argc, char ** argv)
{
FILE *fp;
fp = fopen("/home/test.txt", "w+");
return 0;
}
2.2 关闭文件
函数名:
fclose
函数原型:
int fclose(FILE *fp);
函数功能:
关闭一个已打开的文件
所属头文件:
<stdio.h>
返回值:
成功:返回0 失败:返回EOF
参数说明:
fp:要关闭的文件指针
范例代码:
..........
fclose(fp);
..........
2.3 读文件
函数名:
fread
函数原型:
size_t fread ( void *ptr, size_t size, size_t nmemb, FILE, *stream);
函数功能:
从文件中读取数据
所属头文件:
<stdio.h>
返回值:
成功:返回读取到的数据字节数 失败:返回0
参数说明:
stream:指向要读取的文件
ptr:指向读取出来的数据的保存位置
nmemb:要读取的数据分块的块数
size:每块数据的字节数
范例代码:
#include <stdio.h>
int main(int argc, char ** argv)
{
FILE *fp;
fp = fopen("/home/test.c", "w+");
char c_buf[15];
fread(c_buf,1,10,fp);
c_buf[10] = '\0';
printf("now we read %s\n", c_buf);
fclose(fp);
return 0;
}
2.4 写文件
函数名:
fwrite
函数原型
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
函数功能:
向一个已打开的文件写入数据
所属头文件:
<stdio.h>
返回值:
成功:返回写入文件的字节数 失败:返回0
参数说明:
stream:指向要写入数据的文件
ptr:指向存放数据的位置
nmemb:要写入的数据的块数
size:每块数据字节数
范例代码:
..........
char *c_buf = "9876543210";
..........
fwrite(c_buf, 5, 1,fp);
..........
2.5 文件定位(文件读写指针)
函数名:
fseek
函数原型:
int fseek(FILE *stream, long offset, int whence);
函数功能:
重新定位文件的读写指针位置
所属头文件
<stdio.h>
返回值:
成功:返回0 失败:返回-1
参数说明:
stream:需要被重新定位的位置
offset:指针的偏移量
whence:文件指针从什么位置开始计数,取值如下:
SEEK_SET:从文件头开始偏移offset个字节;
SEEK_CUR:从当前位置开始偏移offset个字节;
SEEK_END:从文件尾开始偏移offset个字节
范例代码:
..........
fseek ( fp, 8, SEEK_SET);
..........
3. 文件复制程序——基于C库
#include <stdio.h>
int main(int argc, char **argv)
{
FILE *fp_s, *fp_t;
int flag;
char buf[512];
fp_s = fopen(argv[1],"r+" );
fp_t = fopen(argv[2], "w+");
while((flag = fread(buf, 1, 512,fp_s)) >0 )
fwrite(buf, 1,flag,fp_t);
fclose(fp_s);
fclose(fp_t);
return 0;
}