初出茅庐的小李博客之C语言文件操作

C语言文件操作

在C语言中,文件操作主要是通过标准库函数来实现的。

今天有时间就来学习下一些常用的文件操作函数:

C 语言提供了一个 FILE 数据结构,记录了操作一个文件所需要的信息。该结构定义在头文件stdio.h,所有文件操作函数都要通过这个数据结构,获取文件信息。

struct _iobuf 
{char *_ptr;      // 指向缓冲区当前位置的指针int _cnt;        // 缓冲区中剩余的字节数char *_base;     // 指向缓冲区起始位置的指针int _flag;       // 文件状态标志(如错误、文件结束等)int _file;       // 文件描述符或句柄int _charbuf;    // 用于单字符缓冲int _bufsiz;     // 缓冲区大小char *_tmpfname; // 临时文件名指针(如果有)
};
typedef struct _iobuf FILE;  // 将结构体重命名为 FILE 类型

什么是文件指针:

开始操作一个文件之前,就要定义一个指向该文件的 FILE 指针,相当于获取一块内存区域,用来保存文件信息。

定义方式:

FILE* fp;

fopen()函数用来打开文件。所有文件操作的第一步,都是使用fopen()打开指定文件。这个函数的原型定义在头文件stdio.h

FILE* fopen(char* filename, char* mode);

它接受两个参数。第一个参数是文件名(可以包含路径),第二个参数是模式字符串,指定对文件执行的操作,比如下面的例子中,r表示以读取模式打开文件;

第一次运行如果没有这个文件,程序会提示错误。如下所示,所以要想以只读的形式打开这个文件那么这样文件要事先存在。我在桌面手动创建了这个文件。再次试验就可以成果打开。

第一次打开出错:
在这里插入图片描述

第二次打开正常:
在这里插入图片描述

打开文件之后我们试着用fread()来读取文件信息。

fread()函数用于一次性从文件读取较大的数据块,主要用途是将文件内容读入一个数组,适合读取二进制数据。它的原型定义在头文件stdio.h

size_t fread(void* ptr, size_t size,size_t nmemb,FILE* fp);

它接受四个参数

  • ptr:数组地址。
  • size:每个数组成员的大小,单位为字节。
  • nmemb:数组的成员数量。
  • fp:文件指针。

读取字节数可以用一个变量来接收,

// 从文件中读取数据
BytesRead = fread(buffer, sizeof(char), sizeof(buffer) - 1, fp);
printf("读到字节数BytesRead = %d\r\n",BytesRead);

在这里插入图片描述

读取数据时候有可能遇到文件为空的情况,这时候就需要检查是不是文件末尾。检查是否到文件末尾函数是feof

feof 是 C 标准库中的一个函数,用于检查文件是否已到达文件末尾(EOF,End of File)。它通常与文件读写函数(如 freadfgets 等)一起使用,以便在读取文件时检测到文件末尾。

feof 函数原型

int feof(FILE *stream);

参数解释

  • stream:指向 FILE 结构的文件指针。

返回值

  • 如果文件指针已到达文件末尾,则返回非零值 (真)。
  • 否则,返回零 (假)。

如果文本文件里面的内容是空的、那么读取到的数据字节数据应该是0。如图所示。

在这里插入图片描述

现在我试着网文件里写入一些信息。再尝试去读取信息

写入的信息是

This is a test txt.
Hello world!
end

编写读取数据到buffer的代码

    BytesRead = fread(buffer, sizeof(char), sizeof(buffer) - 1, fp);printf("读到字节数BytesRead = %d\r\n",BytesRead);if (BytesRead == 0){if (feof(fp))//文件到达末尾返回非零的真值 {printf("空文件、到达文件末尾\n");}else if (ferror(fp)){perror("没读到数据、读取文件时出错");}fclose(fp);return -1;}buffer[BytesRead] = '\0';printf("文件内容: %s\n", buffer);

读取信息入下所示:

打开文件时正常: No error
读到字节数BytesRead = 36
文件内容:
This is a test txt.
Hello world!
end
--------------------------------
Process exited after 0.04219 seconds with return value 0
请按任意键继续. . .

在这里插入图片描述

fclose 是 C 标准库中的一个函数,用于关闭已经打开的文件。关闭文件可以释放与该文件相关的资源,并确保所有缓冲区中的数据被写入文件。

fclose 函数原型

int fclose(FILE *stream);

参数解释

  • stream:指向 FILE 结构的文件指针,该文件指针指向要关闭的文件。

返回值

  • 如果成功关闭文件,返回0。
  • 如果发生错误,返回 EOF(通常为 -1)

完整的代码如下:

#include <stdio.h>int main(void)
{FILE *fp;         // 定义一个 FILE 类型的指针char buffer[256]; // 定义一个缓冲区用于存储读取的数据size_t BytesRead; // 定义读取到多少个字节// 打开一个文件用于读取fp = fopen("example.txt", "r");if (fp == NULL){perror("打开文件时出错");return -1;}else{printf("打开文件正常\r\n");}// 从文件中读取数据BytesRead = fread(buffer, sizeof(char), sizeof(buffer) - 1, fp);printf("读到字节数 BytesRead = %zu\r\n", BytesRead);if (BytesRead == 0){if (feof(fp)) // 文件到达末尾返回非零的真值{printf("空文件或到达文件末尾\r\n");}else if (ferror(fp)){perror("没读到数据,读取文件时出错");}fclose(fp);return -1;}// 为缓冲区添加字符串结束符buffer[BytesRead] = '\0';printf("文件内容:\r\n%s\r\n", buffer);// 关闭文件if (fclose(fp) == 0) // fclose 关闭成功返回0,关闭失败返回EOF{printf("成功关闭文件\r\n");}else{perror("关闭文件时出错");}return 0;
}

补充说明:EOF

C 语言的文件操作函数的设计是,如果遇到文件结尾,就返回一个特殊值。程序接收到这个特殊值,就知道已经到达文件结尾了。

头文件stdio.h为这个特殊值定义了一个宏EOF(end of file 的缩写),它的值一般是-1。这是因为从文件读取的二进制值,不管作为无符号数字解释,还是作为 ASCII 码解释,都不可能是负值,所以可以很安全地返回-1,不会跟文件本身的数据相冲突。

需要注意的是,不像字符串结尾真的存储了\0这个值,EOF并不存储在文件结尾,文件中并不存在这个值,完全是文件操作函数发现到达了文件结尾,而返回这个值。

fopen打开文件模式可能情况

以下是 fopen 函数的所有可能模式及其详细解释,包括注意事项:

模式模式说明文件指针位置文件存在文件不存在读操作写操作注意事项
r读模式文件开始读取文件返回 NULL允许不允许文件必须存在,否则返回 NULL。
w写模式文件开始文件内容被清空创建新文件不允许允许打开时会清空文件内容。
a追加写模式文件末尾文件末尾追加创建新文件不允许允许写操作总是在文件末尾。
r+读写模式文件开始读取和写入返回 NULL允许允许文件必须存在,否则返回 NULL。
w+读写模式文件开始文件内容被清空创建新文件允许允许打开时会清空文件内容。
a+读写模式文件末尾读取和追加创建新文件允许允许写操作总是在文件末尾。

注意事项

  1. r 模式

    • 只读模式,如果文件不存在,返回 NULL。因此在打开文件后,必须检查文件指针是否为 NULL
  2. w 模式

    • 只写模式,打开文件时会清空文件内容。如果文件不存在,则创建新文件。这种模式不允许读取文件内容。
  3. a 模式

    • 追加写模式,文件指针总是指向文件末尾。即使使用 fseek 移动文件指针,写入操作仍会在文件末尾。如果文件不存在,则创建新文件。这种模式不允许读取文件内容。
  4. r+ 模式

    • 读写模式,文件指针指向文件开始,允许读取和写入。如果文件不存在,返回 NULL。因此在打开文件后,必须检查文件指针是否为 NULL
  5. w+ 模式

    • 读写模式,打开文件时会清空文件内容,文件指针指向文件开始。如果文件不存在,则创建新文件。这种模式允许读取和写入,但注意文件内容会被清空。
  6. a+ 模式

    • 读写模式,文件指针指向文件末尾,允许读取和追加。如果文件不存在,则创建新文件。尽管可以读取文件内容,但写操作总是在文件末尾。

示例代码

以下是如何使用这些模式打开文件的示例代码:

#include <stdio.h>void open_file(const char *filename, const char *mode) 
{FILE *fp = fopen(filename, mode);if (fp == NULL) {perror("打开文件失败");return;}printf("以模式 '%s' 成功打开文件\r\n", mode);// 关闭文件if (fclose(fp) == 0) // fclose 关闭成功返回0,关闭失败返回EOF{printf("成功关闭文件\r\n");}else{perror("关闭文件时出错");}
}int main(void) 
{open_file("example_r.txt", "r");open_file("example_w.txt", "w");open_file("example_a.txt", "a");open_file("example_r+.txt", "r+");open_file("example_w+.txt", "w+");open_file("example_a+.txt", "a+");return 0;
}

上边代码运行后只会产生四个文件

在这里插入图片描述

在这里插入图片描述

有关文件操作的接口还有以下几个,如果大家感兴趣可以点个在看,我继续更新!

fwrite():写入文件

fseek():移动文件指针到指定位置

ftell():获取文件指针当前位置

fgetc():从文件中读取一个字符

fputc():写入一个字符到文件中

fscanf():从文件中读取格式化输入

fprintf():按格式写入到文件中

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

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

相关文章

tampermonkey插件下载国家标准文件

#创作灵感# 最近在一个系统招标正文中看到了一些国家标准&#xff0c;想要把文章下载下来&#xff0c;方便查阅&#xff0c;但是“国家标准全文公开系统”网站只提供了在线预览功能&#xff0c;没有提供下载功能&#xff0c;但是公司又需要文件&#xff0c;在网上找了一些办法&…

眼动追踪技术 | 眼动的分类和模型

摘要 灵长类动物用于调整中央凹位置的正常眼动&#xff0c;几乎都可以归结为五种基本类型的组合&#xff1a;扫视、平稳追踪、聚散、前庭眼震和生理性眼震(与注视相关的微小运动)。聚散运动用于将双眼聚焦于远处的目标(深度知觉)。其他运动(如适应和聚焦)指的是眼动的非位置变…

Spring学习03-[Spring容器核心技术IOC学习进阶]

IOC学习进阶 Order使用Order改变注入顺序实现Ordered接口&#xff0c;重写getOrder方法来改变自动注入顺序 DependsOn使用 Lazy全局设置-设置所有bean启动时候懒加载 Scopebean是单例的&#xff0c;会不会有线程安全问题 Order 可以改变自动注入的顺序 比如有个animal的接口&a…

Java实现单点登录(SSO)详解:从理论到实践

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…

miniprogram-to-uniapp-微信小程序转换成uniapp项目

文章目录 参考:miniprogram-to-uniapp使用指南第一步第二步第三步第四步【miniprogram-to-uniapp】转换微信小程序”项目为uni-app项目(新版本工具已经支持各种小程序转换) 参考: 小程序技能树 uni-app基础知识总结 miniprogram-to-uniapp使用指南 第一步 win + R 输入…

打卡第2天----数组双指针,滑动窗口

今天是参与训练营第二天&#xff0c;这几道题我都看懂了&#xff0c;自己也能写出来了&#xff0c;实现思路很重要&#xff0c;万事开头难&#xff0c;希望我可以坚持下去。希望最后的结果是量变带来质变。 一、理解双指针思想 leetcode编号&#xff1a;977 不止是在卡尔这里…

【软件测试】之自动化测试

&#x1f3c0;&#x1f3c0;&#x1f3c0;来都来了&#xff0c;不妨点个关注&#xff01; &#x1f3a7;&#x1f3a7;&#x1f3a7;博客主页&#xff1a;欢迎各位大佬! 文章目录 什么是自动化测试Selenium介绍什么是SeleniumSelenium的特点工作原理 SeleniumJava环境搭建下载…

项目管理实用表格与应用【项目文件资料分享】

项目管理基础知识 项目管理可分为五大过程组&#xff08;启动、规划、执行、监控、收尾&#xff09;十大知识领域&#xff0c;其中包含49个子过程 项目十大知识领域分为&#xff1a;项目整合管理、项目范围管理、项目进度管理、项目成本管理、项目质量管理、项目资源管理、项目…

实现各平台确定性的物理碰撞

1.使用FixedUpdate而不是Update 1.物理运算&#xff0c;比如刚体运动系统的运算是通过固定的时间来驱动的。 2.再moba帧同步游戏中&#xff0c;15帧的固定调用差不多是网络那边的极限了&#xff0c;采用其他手段如平滑显示来提高画面的平滑度。 FixedUpdate是以一个固定的帧率…

前端Debugger时复制的JS对象字符转JSON对象

前端debugger时&#xff0c;复制的对象在控制台输出时是如下格式&#xff0c;需要转换为对象格式来进行验证操作 bridgeId : 4118 createBy : null createTime : "2023-03-24 10:35:26" createUserId : 1 具体实现代码&#xff1a; // 转换transform (text) {l…

腾讯课堂即将停止服务?来试试这款开源的知识付费系统

项目介绍 本系统基于ThinkPhp5.0layuiVue开发,功能包含在线直播、付费视频、付费音频、付费阅读、会员系统、分销系统、拼团活动、直播带货、直播打赏、商城系统等。能够快速积累客户、会员数据分析、智能转化客户、有效提高销售、吸引流量、网络营销、品牌推广的一款应用&…

如何检查购买的Facebook账号优劣?

Facebook 是全球最受欢迎的社交网络之一,为品牌广告提供了巨大的潜力。许多公司和营销人员使用 Facebook 来推广他们的产品和服务&#xff0c;经常会购买账号。当然也分出了很多账号&#xff0c;比如个人号&#xff0c;BM号&#xff0c;广告号&#xff0c;小黑号等等。 但是,有…

【高阶数据结构】图的应用--最短路径算法

文章目录 一、最短路径二、单源最短路径--Dijkstra算法三、单源最短路径--Bellman-Ford算法四、多源最短路径--Floyd-Warshall算法 一、最短路径 最短路径问题&#xff1a;从在带权有向图G中的某一顶点出发&#xff0c;找出一条通往另一顶点的最短路径&#xff0c;最短也就是沿…

图像信号处理器(ISP)基础算法及处理流程

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…

找不到msvcp120.dll无法继续执行的原因分析及解决方法

在计算机使用中&#xff0c;经常会遇到msvcp120.dll文件丢失的情况&#xff0c;很多人对这个文件不是很熟悉&#xff0c;今天就来给大家讲解一下msvcp120.dll文件的丢失以及这个文件的重要性&#xff0c;让大家更好地了解计算机&#xff0c;同时也可以帮助我们更好地掌握这个文…

SpringMVC 的工作流程和详细解释

Spring MVC&#xff08;Model-View-Controller&#xff09;框架是基于经典的 MVC 设计模式构建的&#xff0c;用于开发 Web 应用程序。下面是 Spring Boot MVC 的工作流程和详细解释&#xff1a; 1.客户端发起请求 1.客户端&#xff08;通常是浏览器&#xff09;发起 HTTP 请求…

技术周总结 2024.06.24~06.30(Python并发执行shell并发执行 Spring Bean)

文章目录 一、 06.26 周三1.1&#xff09;问题01&#xff1a;怎么在mysql的命令行中查询出来 python能使用的元祖结果集1.2&#xff09;问题02&#xff1a;python中 set()是什么&#xff0c;怎么使用 二、06.27 周四2.1&#xff09;问题01&#xff1a;shell 并发执行2.2&#x…

MySQL表的练习

二、创建表 1、创建一个名称为db_system的数据库 create database db_system; 2、在该数据库下创建两张表&#xff0c;具体要求如下 员工表 user 字段 类型 约束 备注 id 整形 主键&#xff0c;自增长 id N…

第二十条:与抽象类相比,优先选择接口

要定义多种实现的类型&#xff1a;JAVA有两种机制&#xff1a;接口和抽象类。这两种机制都支持为某些实例方法提供实现&#xff0c;但二者有个重要的区别&#xff1a;要实现由抽象类定义的类型&#xff0c;这个类必须是抽象类的子类。因为Java只允许单继承&#xff0c;对抽象类…

盘点几款国产AI高效神器!打工人赶紧码住

在这个AI技术飞速发展的时代&#xff0c;国产AI工具正成为提升工作效率的得力助手。作为AI工具测评博主&#xff0c;米兔有幸体验了多款国产AI工具&#xff0c;今天要向大家介绍几款超级好用的AI工具。这些工具不仅功能强大&#xff0c;而且操作简便&#xff0c;是职场人士不可…