「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…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
