1.顺序读写函数
这些函数都是 按照顺序读写的,所谓的按顺序读写就是我么你打开文件后光标是从头开始的,每输入一个数据就会自动往下一格移动。上面说的适面于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)。
我们来介绍一对函数其它的也差不多,大家可以自己尝试一下。
1.fgetc
这是这个函数的介绍,我们有了这些知识就可以写以一些代码,这个函数时提取文件里面的数据的。
演示如下:
#include <stdio.h>
int main()
{FILE* pFile;int c;int n = 0;pFile = fopen("myfile.txt", "r");if (pFile == NULL){perror("Error opening file");}else{do {c = fgetc(pFile);if (c == '$') n++;} while (c != EOF);fclose(pFile);printf("The file contains %d dollar sign characters ($).\n", n);}return 0;
}
fgetc提取的数据整型提升为整型,然后返回。
2.fputc
它和fgetc函数经常搭配使用,fgetc函数提取出来的数据,交给fputc来打印输出。这里的stream就可换成stdout这个就是终端的流,我们就可以打印到终端了。
我们运行一下这个代码就可以在当前项目路径找到我们创建的文件夹,然后我们可以在里面输入一些数值。其他的函数大家也可以去试试。
2.文件的随机读写
1.fseek
这个函数是在指定位置提取数据,并整形提升返回。
1. ftell
返回文件指针相对于起始位置的偏移量。用该函数来确定当前光标位置。
2.rewind
让文件指针的位置回到文件的起始位置。也就是将光标回归起始位置。
3.文件读取结束的判定
被错误使用的 feof
牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。
feof 的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束。
1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
• fgetc 判断是否为 EOF .
• fgets 判断返回值是否为 NULL .
2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
• fread判断返回值是否小于实际要读的个数。
文本文件的例子:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int c; // 注意:int,⾮char,要求处理EOF
FILE* fp = fopen("test.txt", "r");
if(!fp) {
perror("File opening failed");
return EXIT_FAILURE;
}
//fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOF
while ((c = fgetc(fp)) != EOF) // 标准C I/O读取⽂件循环
{
putchar(c);
}
//判断是什么原因结束的
if (ferror(fp))
puts("I/O error when reading");
else if (feof(fp))
puts("End of file reached successfully");
fclose(fp);
}
4. 文件缓冲区
ANSIC标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为
程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓
冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。
#include <stdio.h>
#include <windows.h>
//VS2019 WIN11环境测试
int main()
{
FILE*pf = fopen("test.txt", "w");
fputs("abcdef", pf); //先将代码放在输出缓冲区
printf("睡眠10秒-已经写数据了,打开test.txt⽂件,发现⽂件没有内容\n");
Sleep(10000);
printf("刷新缓冲区\n");
fflush(pf); //刷新缓冲区时,才将输出缓冲区的数据写到⽂件(磁盘)
//注:fflush 在⾼版本的VS上不能使⽤了
printf("再睡眠10秒-此时,再次打开test.txt⽂件,⽂件有内容了\n");
Sleep(10000);
fclose(pf);
//注:fclose在关闭⽂件的时候,也会刷新缓冲区
pf = NULL;
return 0;
}
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件的问题。