「C系列」C 文件读写
文章目录
- 一、C 文件读写
- 1. 打开文件
- 2. 写入文件
- 3. 读取文件
- 4. 关闭文件
- 5. 文件读写模式
- 6. 错误处理
- 二、常见问题
- 1. 文件打开失败
- 2. 文件读写错误
- 3. 文件读写位置
- 4. 缓冲区刷新
- 三、相关链接
一、C 文件读写
在C语言中,文件读写是通过一系列的标准库函数来完成的,这些函数在stdio.h
头文件中定义。下面是一些常用的文件读写函数及其使用示例。
1. 打开文件
使用fopen
函数打开文件。它返回一个文件指针,该指针在后续的读写操作中会被用到。如果文件打开失败,fopen
会返回NULL
。
#include <stdio.h>int main() {FILE *file;file = fopen("example.txt", "w"); // 打开文件以写入,如果文件不存在则创建if (file == NULL) {perror("打开文件失败");return 1;}// ... 进行文件写入操作 ...fclose(file); // 关闭文件return 0;
}
2. 写入文件
使用fprintf
、fputc
、fputs
等函数将数据写入文件。
fprintf
:格式化写入,类似于printf
。fputc
:写入一个字符。fputs
:写入一个字符串。
#include <stdio.h>int main() {FILE *file;file = fopen("example.txt", "w");if (file == NULL) {perror("打开文件失败");return 1;}fprintf(file, "Hello, World!\n"); // 写入字符串fputc('A', file); // 写入字符Afputs("This is another line.\n", file); // 写入字符串fclose(file);return 0;
}
3. 读取文件
使用fscanf
、fgetc
、fgets
等函数从文件中读取数据。
fscanf
:格式化读取,类似于scanf
。fgetc
:读取一个字符。fgets
:读取一行字符串。
#include <stdio.h>#define MAX_LINE 100int main() {FILE *file;char line[MAX_LINE];file = fopen("example.txt", "r"); // 打开文件以读取if (file == NULL) {perror("打开文件失败");return 1;}while (fgets(line, MAX_LINE, file) != NULL) { // 逐行读取文件printf("%s", line); // 输出读取到的行}fclose(file);return 0;
}
4. 关闭文件
使用fclose
函数关闭文件。在文件读写操作完成后,一定要关闭文件,以释放系统资源。
5. 文件读写模式
fopen
函数的第二个参数指定了文件的打开模式,常用的模式有:
"r"
:只读模式,文件必须存在。"w"
:只写模式,如果文件不存在则创建,如果文件存在则清空文件内容。"a"
:追加模式,如果文件不存在则创建,如果文件存在则在文件末尾追加内容。"r+"
:读写模式,文件必须存在。"w+"
:读写模式,如果文件不存在则创建,如果文件存在则清空文件内容。"a+"
:读写模式,如果文件不存在则创建,如果文件存在则在文件末尾追加内容,并且可以读取文件内容。
还有其他的模式选项,比如二进制模式"b"
(在某些系统上用于区分文本和二进制文件)。例如,"rb"
表示以二进制只读模式打开文件。
6. 错误处理
在文件操作中,应该始终检查fopen
的返回值以确保文件成功打开。如果fopen
返回NULL
,应该使用perror
或strerror
等函数来打印错误信息。同样,在读取或写入文件时也应该检查相应的返回值以确保操作成功。
二、常见问题
在使用C语言进行文件读写时,可能会遇到一些常见问题。以下是一些常见问题及其详细案例代码:
1. 文件打开失败
当尝试打开一个不存在的文件,或者由于其他原因(如权限问题)无法打开文件时,fopen
会返回NULL
。
案例代码:
#include <stdio.h>
#include <errno.h>
#include <string.h>int main() {FILE *file;file = fopen("nonexistent_file.txt", "r");if (file == NULL) {fprintf(stderr, "打开文件失败: %s\n", strerror(errno));return 1;}// ... 文件操作 ...fclose(file);return 0;
}
2. 文件读写错误
在读写文件时,如果发生错误(如磁盘空间不足、文件被截断等),相关的函数(如fread
, fwrite
)会返回一个与预期不符的值。
案例代码(写入错误):
#include <stdio.h>
#include <stdlib.h>int main() {FILE *file;char buffer[1024] = "这是一些要写入的数据...";size_t bytes_written;file = fopen("example.txt", "w");if (file == NULL) {perror("打开文件失败");return 1;}bytes_written = fwrite(buffer, sizeof(char), sizeof(buffer), file);if (bytes_written != sizeof(buffer)) {fprintf(stderr, "写入文件时发生错误,只写入了%zu字节\n", bytes_written);}fclose(file);return 0;
}
案例代码(读取错误):
#include <stdio.h>
#include <stdlib.h>#define BUFFER_SIZE 1024int main() {FILE *file;char buffer[BUFFER_SIZE];size_t bytes_read;file = fopen("example.txt", "r");if (file == NULL) {perror("打开文件失败");return 1;}bytes_read = fread(buffer, sizeof(char), BUFFER_SIZE, file);if (ferror(file)) {fprintf(stderr, "读取文件时发生错误\n");clearerr(file); // 清除错误标志和结束标志}// 处理读取到的数据...fclose(file);return 0;
}
3. 文件读写位置
默认情况下,文件读写操作是从文件的开始位置进行的。但是,可以使用fseek
函数来移动文件读写位置。
案例代码:
#include <stdio.h>int main() {FILE *file;char buffer[10];file = fopen("example.txt", "r+"); // 以读写模式打开文件if (file == NULL) {perror("打开文件失败");return 1;}// 假设文件内容是 "Hello, World!"// 移动到文件的第7个字节处('W'的位置)if (fseek(file, 6, SEEK_SET) != 0) { // SEEK_SET表示从文件开始位置计算偏移量perror("fseek失败");fclose(file);return 1;}// 读取接下来的3个字节if (fread(buffer, sizeof(char), 3, file) != 3) {perror("fread失败");} else {printf("读取到的内容是: %s\n", buffer); // 输出 "Wor"}fclose(file);return 0;
}
4. 缓冲区刷新
在C语言中,当使用printf
、fprintf
等函数向文件或标准输出(如控制台)写入数据时,这些数据首先会被写入到一个内部缓冲区中,而不是直接写入到文件或输出设备。这种缓冲机制是为了提高I/O效率,因为将数据写入缓冲区通常比直接写入到设备要快得多。然而,在某些情况下,你可能希望立即将数据从缓冲区刷新(flush)到目标设备。
在文件I/O中,你可以使用fflush
函数来刷新文件缓冲区。fflush
函数接受一个文件指针作为参数,并将该指针指向的文件的所有未写入的数据立即写入到文件中。如果参数是NULL
,则fflush
会刷新所有打开的文件流。
下面是一个使用fflush
刷新文件缓冲区的示例代码:
#include <stdio.h>int main() {FILE *file;// 打开文件以写入file = fopen("example.txt", "w");if (file == NULL) {perror("打开文件失败");return 1;}// 写入一些数据到缓冲区fprintf(file, "Hello, World!\n");// 刷新缓冲区,将数据立即写入到文件if (fflush(file) != 0) {perror("刷新文件缓冲区失败");fclose(file);return 1;}// 写入更多的数据到缓冲区fprintf(file, "This is another line.\n");// 关闭文件,这也会隐式地刷新缓冲区fclose(file);return 0;
}
在上面的示例中,我们首先使用fprintf
函数将一些数据写入到文件缓冲区中。然后,我们调用fflush(file)
来立即将这些数据从缓冲区刷新到文件中。之后,我们又写入了更多的数据到缓冲区,但这次我们没有显式地调用fflush
,而是在最后关闭文件时,缓冲区会被隐式地刷新。
需要注意的是,关闭文件(使用fclose
函数)也会刷新该文件的缓冲区。因此,如果你确信在文件操作完成后会关闭文件,那么通常不需要显式地调用fflush
。然而,在某些情况下,你可能希望在关闭文件之前立即看到写入的数据,这时就可以使用fflush
函数来刷新缓冲区。
三、相关链接
- Visual Studio Code下载地址
- Sublime Text下载地址
- 「C系列」C 简介
- 「C系列」C 基本语法
- 「C系列」C 数据类型
- 「C系列」C 变量及常见问题梳理
- 「C系列」C 常量
- 「C系列」C 存储类
- 「C系列」C 运算符
- 「C系列」C 判断/循环
- 「C系列」C 函数
- 「C系列」C 作用域规则
- 「C系列」C 数组
- 「C系列」C enum(枚举)
- 「C系列」C 指针及其应用案例
相关文章:
「C系列」C 文件读写
文章目录 一、C 文件读写1. 打开文件2. 写入文件3. 读取文件4. 关闭文件5. 文件读写模式6. 错误处理 二、常见问题1. 文件打开失败2. 文件读写错误3. 文件读写位置4. 缓冲区刷新 三、相关链接 一、C 文件读写 在C语言中,文件读写是通过一系列的标准库函数来完成的&…...
编程中的cos:深度解析与应用探索
编程中的cos:深度解析与应用探索 在编程的广阔天地中,cos这一数学概念扮演着举足轻重的角色。它不仅是数学函数库中的基础元素,更是图形渲染、科学计算以及数据处理等多个领域的核心工具。本文将从四个方面、五个方面、六个方面和七个方面&a…...

计算机毕业设计hadoop+spark+hive知识图谱酒店推荐系统 酒店数据分析可视化大屏 酒店爬虫 高德地图API 酒店预测系统 大数据毕业设计
流程: 1.Python爬取去哪儿网全站旅游数据约10万,存入mysql; 2.使用pandasnumpy/hadoopmapreduce对mysql中旅游数据进行数据清洗,使用高德API计算地理信息,最终转为.csv文件上传hdfs; 3.hive建库建表导入.csv文件作为数据集&#x…...

简单谈谈云服务器私网IP的存在意义及优势
云服务器是基于虚拟化技术的计算资源,可以在云平台上灵活创建和管理。为了满足不同用户的需求,云服务提供商在云服务器上分配了两种类型的IP地址:公网IP和私网IP。其中,私网IP是指在局域网内使用的内部IP地址,无法通过…...

python错题(2)
、...

禁止methtype联网
mathtype断网_如何禁止mathtype联网-CSDN博客https://blog.csdn.net/qq_41060221/article/details/128144783...

【iOS】UI学习——cell的复用及自定义cell
目录 前言cell的复用手动(非注册)自动(注册) 自定义cell总结 前言 Cell复用和自定义Cell是在开发iOS应用时常见的一种优化技巧和定制需求。 Cell复用是UITableView或UICollectionView的一个重要优化机制。当用户滚动这些视图时…...

【详细介绍下PostgreSQL】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...

基于Matlab停车场车牌识别计时计费管理系统 【W2】
简介 停车场车牌识别计时计费管理系统在现代城市管理中具有重要意义。随着城市化进程的加快和车辆数量的增加,传统的人工管理停车场的方式已经难以满足效率和精确度的要求。因此引入车牌识别技术的自动化管理系统成为一种趋势和解决方案。 背景意义 提升管理效率&a…...

码住!详解时序数据库不同分类与性能对比
加速发展中的时序数据库,基于不同架构,最流行的类别是? 作为管理工业场景时序数据的新兴数据库品类,时序数据库凭借着对海量时序数据的高效存储、高可扩展性、时序分析计算等特性,一跃成为物联网时代工业领域颇受欢迎的…...
【C/C++】实参与形参的区别
在编程中,形参(形式参数)和实参(实际参数)是函数调用中的两个基本概念,它们在函数定义和函数调用中扮演着不同的角色。 形参(Formal Parameters): 形参是在函数定义时声明…...

---异常---
我们在运行程序时总遇到各种与报错,数组越界,空指针的引用,这些在java中都称为异常 对于不同的错误都具有一个与他对应的异常类来秒描述 这是对于数组越界这个类里有的方法,这些是描述异常的 在java中有一个完整的描述异常的类的…...

python如何终止程序运行
方法1:采用sys.exit(0),正常终止程序,从图中可以看到,程序终止后shell运行不受影响。 方法2:采用os._exit(0)关闭整个shell,从图中看到,调用sys._exit(0)后整个shell都重启了(RESTAR…...
网络:用2个IP地址描述一个连接
用2个IP地址描述一个连接。这是在阅读了《TCP/IP指南》后的感想,与工业标准不同,需注意区分。 如果一个IP地址有48位,则用96位描述一个连接 对于单播,是每个IP分别描述位置。位置包括:邮局编号主机编号,采用…...
Nodejs--构建web应用
构建web应用 将从http模块中的服务器端中的request使劲按开始分析,request时间发生于网络连接建立,客户端想服务器发送报文,服务器解析报文,发现http请求的报文的时候,在出发request事件之前,已经准备好Se…...
C++ 二分查找法【面试】
在C中实现二分查找法是一个常见的面试问题。二分查找法是一种在有序数组中查找特定元素的算法,其时间复杂度为O(log n)。以下是使用C实现二分查找的示例代码: #include <iostream> #include <vector>// 二分查找法函数 int binarySearch(co…...
【Docker】docker-compose常用的构建docker容器的yml文件
docker-compose的简单使用方法,在准备好的文件夹中,mkdir好要挂载的如data或者conf文件夹,及vim docker-compose.yml,将下方的要使用的内容粘贴进去,根据自己需要添加/删除/修改一下。最后在当前文件夹直接后台启动即可…...
华为坤灵路由器初始化开局的注意事项,含NAT配置
坤灵路由器比较坑,无web界面,全程命令行配置,但是版本更新导致和华为企业路由器配置很多不一样的地方,今天介绍下 1、aaa密码复杂度修改: #使能设备对密码进行四选三复杂度检查功能。 <HUAWEI>system-view […...

HTTP!!!
HTTP 一 : 请求报文1.2 : 首行1.3 :请求头(header)1.4 : 空行1.5 : 正文 body 二: 响应报文2.2 : 首行 三 : URL 一 : 请求报文 一个HTTP 请求报文, 分成四个部分 首行 GET https://cn.bing.com/?FORMZ9FD1 HTTP/1.1请求头(header)空行正文(body) 1.2 : 首行 首行又分为三个…...

Mybatis用Map接收返回值可能出现的问题
先看一个示例 明明定义了Map<String,String> 实际内部存放的是Integer resultType是Map 也就是说Mybatis是通过反射将类型放进去的 躲过了编辑器检查 但是这样取值时候就会报类型转换错误 解决方式 resultMap 另外一种方式 用Number Integer和Double的父类 Ma…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...