ANSI C标准采用“缓冲文件系统”处理数据文件,所谓缓冲文件系统是指系统自动地在内存区为程序中的每一个正在使用的文件开辟文件缓冲区。这样做是为了节省存储时间,提高效率,缓冲区的大小由各个具体的C编译系统确定。
每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前的位置等)。这些信息被保存在一个结构体变量中。该结构体类型是由系统声明的,命名为FILE。例如有一种C编译环境提供的stdio.h头文件有以下的文件类型声明:
typedef struct {
short level; // 缓冲区"满"或"空"的标志
unsigned flags; // 文件状态标志
char fd; // 文件描述符
unsigned char hold; // 如缓冲区无内容不读取字符
short bsize; // 缓冲区的大小
unsigned char *buffer; // 数据缓冲区的位置
unsigned char *curp; // 文件位置标记指针当前的指向
unsigned istemp; // 临时文件指示器
short token; // 用于有效性检查
} FILE;
不同C编译系统的FILE类型包含的内容不完全相同,但大同小异。
FILE *fp; // 定义了一个指向FILE类型数据的指针变量
通过文件指针变量能够找到与它相关联的文件。
fopen("filename", "使用文件方式"); // 返回一个指向filename文件的指针。
FILE *fp; // 定义一个指向文件的指针变量fp
fp = open("al", r); // 将fopen函数的返回值赋给指针变量fp
使用文件方式
r(只读) w(只写) a(追加)
rb wb ab 与上面相同,只不过是对二进制的操作
通常使用以下方式打开一个文件
if (fp = open("file1", "r") == NULL) {
printf("cannot open this file\n");
exit(0);
}
系统定义了3个文件指针变量stdin, stdout, stderr 分别指向标准输入流,标准输出流,标准出错输出流。它们都以终端作为输入输出对象。
fclose(文件指针); // 返回值:当成功地执行关闭操作,则返回值为0; 否则返回EOF(-1)
在顺序(读)写时,先(读)写入地数据存放在文件中前面的位置,后(读)写入的数据存放在文件中后面的位置。
函数名 | 调用形式 | 功能 | 返回值 |
---|---|---|---|
fgec | fgec(fp) | 从fp指向的文件读入一个字符 | 读成功,带回所读的字符,失败则返回文件结束标志EOF(-1) |
fputc | fputc(ch, fp) | 把字符ch写到文件指针变量fp所指向的文件中 | 输出成功,返回值就是输出的字符;输出失败,则返回EOF(-1) |
fgets | fgets(str, n, fp) | 从fp指向的文件读入一个长度为(n-1)的字符串,存放到字符数组str中 | 读成功,返回地址str, 失败则返回NULL |
fputs | fputs(str, fp) | 把str所指向的字符串写到文件指针变量fp所指向的文件中 | 输出成功,返回0,否则返回非0值 |
fprintf(文件指针, 格式字符串, 输出表列);
fscanf(文件指针, 格式字符串, 输入表列);
fprintf(fp, "%d", "%6.2f", i, f);
fscanf(fp, "%d", "%f", &i, &f);
用fprintf和fscanf函数要进行字符和二进制的转换,需要花费较多时间。不建议使用
fread(buffer, size, count, fp);
fwrite(buffer, size, count, fp);
其中,buffer是一个(起始)地址,size表示要读写多少的字节数,count表示要读写多少个数据项(每个数据项的长度为size), fp表示FILE类型指针。
fread(f, 4, 10, fp); // 从fp所指向的文件读入10个4个字节的数据,存储到数组f中
如果fread或fwrite函数执行成功,则函数返回值为count的值。
(1). 用rewind时文件位置标记指向文件开头。此函数没有返回值。
(2). 用seek函数改变文件位置标记
fseek(文件类型指针, 位移量, 起始点);
起始点 | 名字 | 用数字代表 |
---|---|---|
文件开始位置 | SEEK_SET | 0 |
文件当前位置 | SEEK_CUR | 1 |
文件末尾位置 | SEEK_END | 2 |
其中,起始点用0, 1, 2代替。 位移量指 以"起始点"为基点,向前移动的字节数。位移量应是long型数据。
fseek(fp, 100L, 0);
fseek(fp, 50L, 1);
fssek(fp, -10L, 2);
(3).用ftell函数测定文件位置标记的当前位置
i = ftell(fp);
if (i == -1L)
printf("error");
ferror函数
ferror(fp); // 返回值为0,表示未出错。如果返回一个非零值,表示出错
clearerr函数
clearerr(fp); // 使ferror的值为0,清除错误标志位
原文:https://www.cnblogs.com/ice036/p/14456406.html