C语言——文件相关操作补充

一、文件读取结束的判定

当我们使用例如fgetc、fgets、fscanf、fread等函数来读取文件内容时,我们可能遇到需要判断文件读取的结束,一般情况下都是通过这些函数的返回值来判断文件读取是否结束。

1、fgetc

返回读取的字符的ASCII值,如果读到文件末尾或发生错误,则返回EOF(通常定义为-1)。

所以在使用fgetc函数读取文件内容时,要判断文件读取的结束则判断fgetc函数的返回值是否是EOF,如果fgetc函数的返回值为EOF,则可能是达到文件结尾,也就是文件读取结束。

例如使用fgetc以一个个字符读取文件的所有内容并打印出来:

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return -1;}char ch = 0;while ((ch = fgetc(pf)) != EOF)//使用fgetc函数的返回值作为判断,如果是EOF,则可能是读取结束{printf("%c ", ch);}printf("\n");fclose(pf);pf = NULL;return 0;
}

文件内容为:

运行结果:

2、fgets

返回指向读取字符串的指针,如果读到文件末尾或发生错误,则返回NULL

如果fgets函数的返回值为NULL,则可能是达到文件结尾,也就是文件读取结束。

例如尝试使用fgets函数将文件的内容一行行读取并打印:

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return -1;}char str[100] = { 0 };while (fgets(str,100,pf) != NULL)//使用fgets函数的返回值作为判断,如果是NULL,则可能是读取结束{printf("%s", str);}fclose(pf);pf = NULL;return 0;
}

文件内容:

运行结果:

3、fscanf

返回成功匹配和赋值的输入项数,如果读到文件末尾或发生错误,则返回EOF

如果fscanf函数的返回值为EOF,则可能是达到文件结尾,也就是文件读取结束。

使用fscanf函数格式化读取文件中所有数据:

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return -1;}int id = 0;char name[10] = { 0 };int age = 0;while (fscanf(pf, "%d %s %d", &id, name, &age) == 3)//使用fscanf的返回值作为判定条件,如果返回值不等于期望匹配项,则可能是文件读取完成{printf("%d %s %d\n", id, name, age);}fclose(pf);pf = NULL;return 0;
}

文件内容:

运行结果:

4、fread

函数原型:

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

返回成功读取的元素个数,如果读到文件末尾或发生错误,则返回值可能小于count

文件内容,使用下面的程序写入test.bin文件中:

#include <stdio.h>int main()
{FILE* pf = fopen("test.bin", "wb");if (pf == NULL){perror("fopen");return -1;}int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };fwrite(arr, sizeof(int), sizeof(arr) / sizeof(int), pf);fclose(pf);pf = NULL;return 0;
}

使用二进制编辑器打开查看(这里是小端字节序):

使用fread读取十个整形数据:

#include <stdio.h>int main()
{FILE* pf = fopen("test.bin", "rb");if (pf == NULL){perror("fopen");return -1;}int temp = 0;while (fread(&temp, sizeof(int), 1, pf) == 1)//以fread函数的返回值为判定,因为这里读取元素个数为1,正确读取应当返回1,如果返回值不是1,则可能是文件结尾,也就是文件读取完成{printf("%d ", temp);}printf("\n");fclose(pf);pf = NULL;return 0;
}

运行结果:

5、总结

  • 对于fgetc,当返回值为EOF时,可能表示文件读取结束。
  • 对于fgets,当返回值为NULL时,可能表示文件读取结束。
  • 对于fscanf,当返回值为EOF时,可能表示文件读取结束。
  • 对于fread,当返回值小于请求的元素个数count时,可能表示文件读取结束。

二、feof和ferror

在上面的文件读取结束的判定中,只是初步的判定,因为对于那些读取文件的函数的特殊返回值不一定是代表文件到了结尾(文件读取结束),也可能是代表文件读取错误。所以我们需要判断是哪一种情况,到底是文件读取结束还是文件读取错误,就需要下面的两个函数。

1、feof

feof函数用于检测文件的结束标志(End-Of-File)。

函数原型:

函数参数和返回值:

参数 stream 是文件流指针,当文件指针到达文件末尾时,feof函数返回非零值(通常是1),否则返回0。

2、ferror

ferror函数用于检测文件操作是否发生错误。

函数原型:

函数参数和返回值:

参数 stream 是文件流指针,如果在文件操作过程中发生错误,ferror函数返回非零值(通常是1),否则返回0。

3、使用示例:

如果需要区分文件结束和读取错误,可以使用feofferror函数。

test.txt文件内容:

下面的代码尝试以一个个字符读取此文件的全部内容,并且打印出来:

#include <stdio.h>int main() {FILE* pf = fopen("test.txt", "r");if (pf == NULL) {perror("fopen");return 0;}char ch = 0;while ((ch = fgetc(pf)) != EOF) {printf("%c ", ch);}printf("\n");if (feof(pf)) {printf("文件读取结束\n");}else if (ferror(pf)) {printf("文件读取错误\n");}fclose(pf);pf = NULL;return 0;
}

运行结果:

在上述代码中,feof(file)用于检查是否到达文件末尾,而ferror(file)用于检查是否发生了读取错误。这里的结果是文件读取结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/692215.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信授权登录02-移动端

目录 ## 前言 1.准备工作 1.1 网站域名 1.2 微信公众号 2.授权登录开发 2.1 前端开发 2.1.1 调起微信授权页面 ## 调起微信授权页面效果图 2.1.2 用户允许授权后回调处理 2.2 后端开发 2.2.1 根据code查询用户信息 2.2.2 自动注册登录 ## 后记 ## 前言 上一篇写…

使用Flask构建POST请求的Web应用

文章目录 准备工作创建路由处理POST请求创建表单页面运行应用结论 在Web开发中&#xff0c;处理POST请求是一项常见任务&#xff0c;特别是在构建表单提交、用户注册和数据提交等功能时。Flask是一个简单而强大的Python Web框架&#xff0c;它提供了方便的工具来处理HTTP请求&a…

bash tab 补全报错 bash: syntax error near unexpected token `(‘

使用 vim 编辑文件时&#xff0c;敲下 vim xxx 后&#xff0c;再键入 tab 键报进行补全报错 bash: syntax error near unexpected token (. 打开 bash 的命令执行详情 set -v 定位到具体的代码&#xff1a; 显然&#xff0c;代码位于 bash 补全的逻辑当中。 定位代码具体的…

大学生体质测试|基于Springboot+vue的大学生体质测试管理系统设计与实现(源码+数据库+文档)

大学生体质测试管理系统 目录 基于Springboot&#xff0b;vue的大学生体质测试管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 4教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算…

Nios-II编程入门实验

文章目录 一 Verilog实现流水灯二 Nios实现流水灯2.1 创建项目2.2 SOPC添加模块2.3 SOPC输入输出连接2.4 Generate2.5 软件部分2.6 运行结果 三 Verilog实现串口3.1 代码3.2 引脚3.3 效果 四 Nios2实现串口4.1 sopc硬件设计4.2 top文件4.3 软件代码4.4 实现效果 五 参考资料六 …

java入门-面向对象的三大特性

面向对象三大特性 封装 什么是封装 封装 是将代码及其处理的数据绑定在一起的一种编程机制&#xff0c;该机制保证了程序和数据都不受外部干扰且不被误用。 封装的作用 访问控制符 方法传参-值传递 传参类型是基本类型 程序案例&#xff1a; public static void main(St…

BGP学习一:关于对等体建立和状态组改变

目录 一.BGP基本概念 &#xff08;1&#xff09;.BGP即是协议也是分类 1.早期EGP 2.BGP满足不同需求 3.BGP区域间传输的优势 &#xff08;1&#xff09;安全性——只传递路由信息 &#xff08;2&#xff09;跨网段建立邻居 4.BGP总结 5.BGP的应用 &#xff08;1&#…

力扣HOT100 - 295. 数据流的中位数

解题思路&#xff1a; 小顶堆 大顶堆 class MedianFinder {Queue<Integer> A, B;public MedianFinder() {A new PriorityQueue<>();B new PriorityQueue<>((x, y) -> (y - x));}public void addNum(int num) {if (A.size() ! B.size()) {A.add(num);B…

攻防世界-web-file_include

题目 解题 通过阅读php代码&#xff0c;我们明显的可以发现&#xff0c;这个一个文件包含的类型题 文件包含漏洞也是一种“注入型漏洞”&#xff0c;其本质就是输入一段用户能够控制的脚本或者代码&#xff0c;并让服务器端执行。 require()&#xff0c;找不到被包含的文件时…

Vditor集成于VUE笔记

文章目录 前言一、安装Vditor二、渲染markdown三、options3.1 自建CDN3.2 outline大纲不显示、不跳转问题3.3 upload 图片/视频上传3.4 toolbar提示位置点击事件more中文字 3.5 sv分屏渲染模式隐藏编辑框3.6 after中的insertValue或者setValue 前言 Vditor是一款易于使用的 Ma…