【文件随机读写和文件缓冲区】
创始人
2024-05-13 10:01:08
0

1.1fseek函数

  • 1.2ftell函数
  • 1.3rewind函数
  • 2. 文件读取结束的判定
  • 2.1文件缓冲区

1.1fseek函数

根据文件指针的位置和偏移量来定位文件指针。

int fseek ( FILE * stream, long int offset, int origin );

看不懂没关系,举个例子你就明白了。

我们首先在text.txt文件中放入 “abcdef” 这些字符。
在这里插入图片描述

int main()
{FILE* pf = fopen("text.txt", "r");int ch = 0;if (pf == NULL){perror("fopen");}else{ch = fgetc(pf);printf("%c\n", ch);//ach = fgetc(pf);printf("%c\n", ch);//bch = fgetc(pf);printf("%c\n", ch);//c}return 0;
}

然后我们用fgetc函数读取三个字符,注意,fgetc函数,每读取完一个字符,光标就会自动跳转到下一位,此时已经读取完三个字符了,光标自然就指向了d位置,再读取的时候,就会读取d。

但是我不想读取d位置了,我想回头读取b位置。

此时有对fseek函数来说,有三种方法:
在这里插入图片描述
如果这样输入:

fseek(pf, 1, SEEK_SET);

此时光标就移动到了最开始位置的下一个位置,即b位置。
在这里插入图片描述
结果证实了上述结论。

我们还可以这样写:

fseek(pf, -2, SEEK_CUR);

对标上面的图,是从当前位置的光标,向左移动2个光标位置,当前位置的光标是在d处,向左移动2个位置,就移动到了b处,此时读取,就读取到了b。
在这里插入图片描述
至于最后一种方式,SEEK_END 这样的读取方式,较难以使用,因为本来就不知道文件有多长,有多少数据,不过这种方式可以使用ftell函数来代替。

1.2 ftell函数

ong int ftell ( FILE * stream );

返回文件指针相对于起始位置的偏移量
ftell函数返回的是从当前位置相对于起始位置的偏移量。

仍以上面的例子为例

int main()
{FILE* pf = fopen("text.txt", "r");int ch = 0;if (pf == NULL){perror("fopen");}else{ch = fgetc(pf);printf("%c\n", ch);//ach = fgetc(pf);printf("%c\n", ch);//bch = fgetc(pf);printf("%c\n", ch);//cint a = ftell(pf);printf("%d\n", a);}return 0;
}

此时光标移动到了c位置,使用ftell函数,返回相对起始位置的偏移量,即 3

1.3 rewind函数

void rewind ( FILE * stream );

rewind 让文件指针的位置回到文件的起始位置

相比之下,ftell函数和rewind函数更加简单粗暴。

int main()
{FILE* pf = fopen("text.txt", "r");int ch = 0;if (pf == NULL){perror("fopen");}else{ch = fgetc(pf);printf("%c\n", ch);//ach = fgetc(pf);printf("%c\n", ch);//bch = fgetc(pf);printf("%c\n", ch);//crewind(pf);ch = fgetc(pf);printf("%c\n", ch);//a}return 0;
}

举一个例子,就可以理解了。

2. 被误解的feof函数

在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

  1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL( fgets )
    例如:
    fgetc 判断是否为 EOF .
    fgets 判断返回值是否为 NULL .

  2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
    例如:
    fread判断返回值是否小于实际要读的个数。

举个简单例子:

int main(void)
{int c; // 注意:int,非char,要求处理EOFFILE* fp = fopen("test.txt", "r");if (!fp) {perror("File opening failed");return EXIT_FAILURE;}//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOFwhile ((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);
}

当读取结束时,无论是读取失败还是遇到文件末尾, 都会返回EOF,此时就有两种情况,分别用ferror和feof函数进行判断即可。

2.1 文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序
中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装
满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓
冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根
据C编译系统决定的。

在这里插入图片描述
意思是这样的:
当我们写程序向文件中写入信息时,这些信息会先被放在输出缓冲区中,当输出缓冲区被充满后,再依次送到硬盘中。
当我们写程序向文件中读取信息时,这些信息会先被放在输入缓冲区中,当输入缓冲区被充满后,再依次送到我们手中。

在这里插入图片描述

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...