5.文件的随机读写
5.1fseek
根据文件指针的位置和偏移量来定位文件指针
第一个参数,指向流的指针,也就是 pf 第二个参数,偏移的字节数 第三个参数,偏移参考的位置
偏移参考的位置分三种情况
1.文件的开头
2.文件的中间
3.文件的末尾
示例如下
先把26个写入文件中
int main() { FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { printf("%s\n", strerror(errno)); return; } //读文件 //定位文件指针 fseek(pf, 1, SEEK_SET); int ch = fgetc(pf);//b printf("%c\n", ch); fseek(pf, -1, SEEK_END); ch = fgetc(pf);//y printf("%c\n", ch); //关闭文件 fclose(pf); pf = NULL; return 0; }
5.2ftell
返回文件指针相对于起始位置的偏移量
只有一个参数是指向流的指针,也就是pf
结合上面的函数,代码如下
int main() { FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { printf("%s\n", strerror(errno)); return; } //读文件 //定位文件指针 fseek(pf, 1, SEEK_SET); int ch = fgetc(pf);//b printf("%c\n", ch); //返回文件指针相对于起始位置偏移量 printf("%d\n", ftell(pf));//2 fseek(pf, -1, SEEK_END); ch = fgetc(pf);//y printf("%c\n", ch); //返回文件指针相对于起始位置偏移量 printf("%d\n", ftell(pf));//25 //关闭文件 fclose(pf); pf = NULL; return 0; }
5.3rewind
让文件指针的位置返回到文件的起始位置
实例如下
int main() { FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { printf("%s\n", strerror(errno)); return; } //读文件 //定位文件指针 fseek(pf, 1, SEEK_SET); int ch = fgetc(pf);//b printf("%c\n", ch); //返回文件指针相对于起始位置偏移量 printf("%d\n", ftell(pf));//2 //让文件指针的位置返回到文件的起始位置 rewind(pf); printf("%d\n", ftell(pf));//0 fseek(pf, -1, SEEK_END); ch = fgetc(pf);//y printf("%c\n", ch); //返回文件指针相对于起始位置偏移量 printf("%d\n", ftell(pf));//25 //让文件指针的位置返回到文件的起始位置 rewind(pf); printf("%d\n", ftell(pf));//0 //关闭文件 fclose(pf); pf = NULL; return 0; }
6.文本文件和二进制文件
根据数据的组织形式,数据文件被称为文本文件或者二进制文件
数据在内存中以二进制的形式存储,若不加转换的输出到外存,就是二进制文件
如果要求在外存上以ASCII码的形式存储,需要在存储前进行转换。以ASCII字符的形式存储的文件就是文本文件
数据在内存到底是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据即可用ASCII形式存储,也可以用二进制形式存储
整数100000,如果以ASCII码的形式输出到磁盘,则磁盘中占用6个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节
测试代码
int main() { int i = 100000; FILE* pf = fopen("test.txt", "wb"); if (pf == NULL) { printf("%s\n", strerror(errno)); return; } fwrite(&i, 4, 1, pf); fclose(pf); pf = NULL; return 0; }
7.文件读取结束的判断
7.1feof
的正确使用
在文件读取过程中,不能使用feof函数的返回值直接用来判断文件是否结束,而应用于当文件读取结束时,判断时读取失败结束,还是遇到文件末尾结束。
1.文本文件读取是否结束,判断返回值是否为EOF,或者NULL
例如
fgetc判断是否为EOF
fgets判断是否为NULL
2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数
例如
fread判断返回值是否小于实际要读的个数
8.文件缓冲区
ASCII标准采用”缓存文件系统“处理数据文件,所谓缓冲文件系统时指系统自动地在内存中为程序中每个正在使用的文件开辟一块文件缓冲区。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。
反过来,当从磁盘向内存读入数据,则从磁盘文件中读取数据输入到内存缓冲区,充满内存缓冲区后,再从缓冲区逐个地将数据送到程序数据区。
结论
由于缓冲区的存在,C语言在操作文本时,需要刷新缓冲区或者在文件操作结束时关闭文件,如果省略此步骤可能会导致读写文件的问题。