目录
前言
6、文本文件和二进制文件
7、文件读取结束的判定
7.1 被错误使用的feof
8、文件缓冲区
总结
前言
接上篇,本篇要讲解的是文本文件和二进制文件的内容、文件读取结束的判定以及文件缓冲区。
6、文本文件和二进制文件
根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
数据在内存中以二进制的形式存储,如果不加转换的输出到外村,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
一个数据在内存中是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据既可以以ASCII形式存储,也可以使用二进制形式存储。
如果有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(整型大小为4字节)。
测试代码:
#include <stdio.h>int main()
{int a = 10000;FILE* pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf);fclose(pf);pf = NULL;return 0;
}
这是用二进制对文件进行读写,在路径下生成名为“test.txt”的文件,其内容为:
7、文件读取结束的判定
7.1 被错误使用的feof
在文件读取的过程中,不能用feof函数的返回值直接来判断文件是否结束。而是应用于当文件读取结束的时候,判断文件读取结束的原因:是读取失败结束,还是遇到文件尾端结束。
现在一些书上对feof的使用是错误的。
那么下面举两个用于判断文件读取是否结束的方法:
1、文本文件读取是否结束,判断返回值是否为EOF或者NULL。
对于不同的函数,其结束时返回的内容不同,如:fgetc结束时返回EOF;fgets结束时返回NULL。
2、二进制文件的读取结束判断,判断返回值是否小于实际要读取的个数
例如:fread判断返回值是否小于实际要读的个数。fread函数其中有一个参数是让我们输入要读取内容的个数,它的返回值是实际读取的内容的个数,如果实际的读取个数小于我们一开始设定的读取个数,说明,整个文件被读完了,很好理解吧。
8、文件缓冲区
ANSIC标准采用“缓冲文件系统”处理数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中的每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区地大小根据C编译系统决定的。
如上图,在程序数据和文件之间,数据还要经过缓冲区,而不是直接将程序数据放到文件中。这样做的目的是为了提高整个操作系统的效率。
举个例子,如果系统数据直接和文件交互,那么每当系统产生一个数据,计算机都要经行一次数据传输,但是有了缓冲区,可以将数据暂时保存,等到数据达到一定量的时候,再一次性全部传输到文件中,这样可以提高效率,减少时间成本。
总结
关于C语言文件操作,就讲到这。本知识点共四篇文章C语言:文件操作(一)、C语言:文件操作(二)C语言:文件操作(三)、C语言:文件操作(四)。全面讲解了C语言文件操作的内容,希望对你有所帮助。