一、 函数对比
scanf/fscanf/sscanf
printf/fprintf/sprintf
scanf 针对标准输入(键盘)的格式化输入函数
printf 针对标准输出(屏幕)的格式化输出函数
fscanf 针对所有输入流的格式化输入函数
fprintf 针对所有输出流的格式化输出函数
sscanf 从一段字符串中读出格式化的数据
sprint 把一个格式化的数据转化为字符串
二、文件的随机读写与结束判定
fseek
根据⽂件指针的位置和偏移量来定位⽂件指针。
int fseek ( FILE * stream, long int offset, int origin );
偏移量 起始位值 SEEK_SET 开
SEEK_CUR 现在
SEEK_END 尾
feof 在文件读取结束后,判断是否因为遇到文件末尾而结束。判断是否为EOF。
ferror 在文件读取结束后,判断是否因为遇到错误而结束。判断返回值是否为NULL。
三、文件缓冲区
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语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂件。
如果不做,可能导致读写⽂件的问题。
这个是对上一节文件操作中的一些补充,本节的内容结束,谢谢大家的观看!