前言
在C语言学习中,我们会学到一些文件的操作,和编译预处理的知识,这里我只讲到文件操作的一部分。如果内容有错误,愿意倾听指点,共同学习,共同进步 ~0,0~
一、文件读取结束的判断
在判断文件读取结束的时候,我们通常可以用feof函数的返回值直接用来判断文件的结束,但这是错误的方式,因为feof函数是应用于当文件读取结束的时候,判断文件是读取失败结束,还是遇到文件尾结束,这和判断文件结束可是两码事,我们需要注意。
1.文本文件读取是否结束,我们可以判断返回值是否为EOF(end of file) 或者 是NULL
例如,我们可以用fgetc这个函数, 这个函数是当文件读取失败的时候或者遇到文件尾的时候,都会返回EOF 否则获取这个字符,用fgets来判断是否为NULL
所以,我们可以判断fgetc是否为EOF ,fgets返回值是否为NULL
2.二进制文件的读取结束时候的判断,我们可以判断返回值是否小于实际要读的个数
例如,我们可以用fread这个函数判断返回值是否小于实际要读的个数
让我们可以看下下面这个例子:
int main()
{
int c;//要处理EOF ,用int 而非char
FILE* fp = fopen("test.txt", "r");
if (!fp)
{
perror("File opening failed");
return 1;
}
//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
while ((c = fgetc(fp)) != EOF)
{
putchar(c);
}
//判断是什么原因结束的
if (ferror(fp))//是因为读取失败结束
{
puts("I/O error when reading");
}
else if (feof(fp))//是因为遇到了文件尾结束
puts("End of file reached successfully");
fclose(fp);
return 0;
}
二、文件缓冲区
其实在ANSIC标准,也就是C语言标准,是由采用“缓冲文件系统”处理的数据文件的,文件缓冲区也就是系统在为每一个使用的文件开辟一块“文件缓冲区”,他们之间会有下面这样的关系
通常,文件是文件在进行操作时,需要做刷新缓冲区或者文件操作结束时关闭文件
不写,可能导致读写文件的问题
三、编译预处理
程序在ANSIC的任何一种实现中,都会经历两个不同的环境
第一种是翻译环境,第二种是执行环境,用于实际执行代码(如下图)
程序都会进行这两个环境才会最终运行,期间每个环境都有各自的功能与作用,有时我们可以在程序报错中得知,我们写的代码在哪个环境下出现了错误,便于我们可以快速找出bug。