当前位置: 首页 > news >正文

「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. 写入文件

使用fprintffputcfputs等函数将数据写入文件。

  • 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. 读取文件

使用fscanffgetcfgets等函数从文件中读取数据。

  • 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,应该使用perrorstrerror等函数来打印错误信息。同样,在读取或写入文件时也应该检查相应的返回值以确保操作成功。

二、常见问题

在使用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语言中,当使用printffprintf等函数向文件或标准输出(如控制台)写入数据时,这些数据首先会被写入到一个内部缓冲区中,而不是直接写入到文件或输出设备。这种缓冲机制是为了提高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函数来刷新缓冲区。

三、相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C系列」C 简介
  4. 「C系列」C 基本语法
  5. 「C系列」C 数据类型
  6. 「C系列」C 变量及常见问题梳理
  7. 「C系列」C 常量
  8. 「C系列」C 存储类
  9. 「C系列」C 运算符
  10. 「C系列」C 判断/循环
  11. 「C系列」C 函数
  12. 「C系列」C 作用域规则
  13. 「C系列」C 数组
  14. 「C系列」C enum(枚举)
  15. 「C系列」C 指针及其应用案例

相关文章:

「C系列」C 文件读写

文章目录 一、C 文件读写1. 打开文件2. 写入文件3. 读取文件4. 关闭文件5. 文件读写模式6. 错误处理 二、常见问题1. 文件打开失败2. 文件读写错误3. 文件读写位置4. 缓冲区刷新 三、相关链接 一、C 文件读写 在C语言中&#xff0c;文件读写是通过一系列的标准库函数来完成的&…...

编程中的cos:深度解析与应用探索

编程中的cos&#xff1a;深度解析与应用探索 在编程的广阔天地中&#xff0c;cos这一数学概念扮演着举足轻重的角色。它不仅是数学函数库中的基础元素&#xff0c;更是图形渲染、科学计算以及数据处理等多个领域的核心工具。本文将从四个方面、五个方面、六个方面和七个方面&a…...

计算机毕业设计hadoop+spark+hive知识图谱酒店推荐系统 酒店数据分析可视化大屏 酒店爬虫 高德地图API 酒店预测系统 大数据毕业设计

流程&#xff1a; 1.Python爬取去哪儿网全站旅游数据约10万&#xff0c;存入mysql; 2.使用pandasnumpy/hadoopmapreduce对mysql中旅游数据进行数据清洗&#xff0c;使用高德API计算地理信息&#xff0c;最终转为.csv文件上传hdfs; 3.hive建库建表导入.csv文件作为数据集&#x…...

简单谈谈云服务器私网IP的存在意义及优势

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

python错题(2)

、...

禁止methtype联网

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

【iOS】UI学习——cell的复用及自定义cell

目录 前言cell的复用手动&#xff08;非注册&#xff09;自动&#xff08;注册&#xff09; 自定义cell总结 前言 Cell复用和自定义Cell是在开发iOS应用时常见的一种优化技巧和定制需求。   Cell复用是UITableView或UICollectionView的一个重要优化机制。当用户滚动这些视图时…...

【详细介绍下PostgreSQL】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

基于Matlab停车场车牌识别计时计费管理系统 【W2】

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

码住!详解时序数据库不同分类与性能对比

加速发展中的时序数据库&#xff0c;基于不同架构&#xff0c;最流行的类别是&#xff1f; 作为管理工业场景时序数据的新兴数据库品类&#xff0c;时序数据库凭借着对海量时序数据的高效存储、高可扩展性、时序分析计算等特性&#xff0c;一跃成为物联网时代工业领域颇受欢迎的…...

【C/C++】实参与形参的区别

在编程中&#xff0c;形参&#xff08;形式参数&#xff09;和实参&#xff08;实际参数&#xff09;是函数调用中的两个基本概念&#xff0c;它们在函数定义和函数调用中扮演着不同的角色。 形参&#xff08;Formal Parameters&#xff09;&#xff1a; 形参是在函数定义时声明…...

---异常---

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

python如何终止程序运行

方法1&#xff1a;采用sys.exit(0)&#xff0c;正常终止程序&#xff0c;从图中可以看到&#xff0c;程序终止后shell运行不受影响。 方法2&#xff1a;采用os._exit(0)关闭整个shell&#xff0c;从图中看到&#xff0c;调用sys._exit(0)后整个shell都重启了&#xff08;RESTAR…...

网络:用2个IP地址描述一个连接

用2个IP地址描述一个连接。这是在阅读了《TCP/IP指南》后的感想&#xff0c;与工业标准不同&#xff0c;需注意区分。 如果一个IP地址有48位&#xff0c;则用96位描述一个连接 对于单播&#xff0c;是每个IP分别描述位置。位置包括&#xff1a;邮局编号主机编号&#xff0c;采用…...

Nodejs--构建web应用

构建web应用 将从http模块中的服务器端中的request使劲按开始分析&#xff0c;request时间发生于网络连接建立&#xff0c;客户端想服务器发送报文&#xff0c;服务器解析报文&#xff0c;发现http请求的报文的时候&#xff0c;在出发request事件之前&#xff0c;已经准备好Se…...

C++ 二分查找法【面试】

在C中实现二分查找法是一个常见的面试问题。二分查找法是一种在有序数组中查找特定元素的算法&#xff0c;其时间复杂度为O(log n)。以下是使用C实现二分查找的示例代码&#xff1a; #include <iostream> #include <vector>// 二分查找法函数 int binarySearch(co…...

【Docker】docker-compose常用的构建docker容器的yml文件

docker-compose的简单使用方法&#xff0c;在准备好的文件夹中&#xff0c;mkdir好要挂载的如data或者conf文件夹&#xff0c;及vim docker-compose.yml&#xff0c;将下方的要使用的内容粘贴进去&#xff0c;根据自己需要添加/删除/修改一下。最后在当前文件夹直接后台启动即可…...

华为坤灵路由器初始化开局的注意事项,含NAT配置

坤灵路由器比较坑&#xff0c;无web界面&#xff0c;全程命令行配置&#xff0c;但是版本更新导致和华为企业路由器配置很多不一样的地方&#xff0c;今天介绍下 1、aaa密码复杂度修改&#xff1a; #使能设备对密码进行四选三复杂度检查功能。 <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…...

Web爬虫--fofa-资产信息搜集

免责声明:本文仅做技术交流与学习... 目录 fofa.py fofa搜索参数分析 fofa_api.py fofa.py import requests from bs4 import BeautifulSoup# 登录fofa之后,把自己的cookie弄过来. header{cookie: } # 参数为搜索的语法. urlhttps://fofa.info/result?qbase64dGl0bGU9IuS4…...

mySql的事务(操作一下)

目录 1. 简介2. 事务操作3. 四大特性4. 并发事务问题5. 脏读6. 不可重复读7. 幻读事务隔离级别参考链接 1. 简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作…...

UniApp或微信小程序中scroll-view组件使用show-scrollbar在真机Android或IOS中隐藏不了滚动条的解决办法

show-scrollbar 属性 不论是使用 变量 还是直接使用 布尔值或者直接使用 css 都是在 ios、Android 上是都没有效果。。 真机中还是出现滚动条 解决办法 添加下面CSS ::-webkit-scrollbar {display: none;width: 0 !important;height: 0 !important;-webkit-appearance: no…...

每天五分钟深度学习框架pytorch:多维tensor向量在某一维度的拼接和分割

本文重点 在深度学习中,我们常常需要完成多个向量拼接,同时也要完成向量的分割,在pytorch中已经有封装好的库,我们可以直接调用完成这部分任务。 Cat拼接 c=torch.cat([a,b],dim=0)表示将a和b按0维度进行拼接,需要注意再非dim维度,两个矩阵的维度必须是一致的,不然会拼…...

从C语言到C++(五)

从C语言到C&#xff08;五&#xff09; 自动类型推导尾拖返回类型类型信息推导typeid1. 定义和基本作用2. 使用方法3. 注意事项4. 示例代码5. 关联概念&#xff1a;RTTI decltype基本用法示例注意事项总结 基于范围的增强for循环示例 1&#xff1a;使用数组示例 2&#xff1a;使…...

数据结构——栈(Stack)详解

1. 栈&#xff08;Stack&#xff09; 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中数据元素遵循后进先出LIFO(Last In First Out)的原则 压栈&am…...

1.Element的table表高度自适应vue3+js写法

解决方法 在页面table上添加id&#xff0c;动态计算每页table的最大高度 &#xff0c;将高度保存在store中&#xff0c;每次切换路由时进行计算。 文章目录 解决方法前言一、页面table使用二、store状态库1.引入库 效果 前言 提示&#xff1a;状态管理使用的是pinia,用法参考…...

联想电脑电池只能充到80%,就不在充电了,猛一看以为坏了,只是设置了养护模式。

现在电池管理模式有三种&#xff1a; 1&#xff09;常规 2&#xff09;养护 3&#xff09;快充 好久没有用联想的电脑了&#xff0c;猛一看&#xff0c;咱充到了80%不充了&#xff0c;难道电池是坏的&#xff1f;我们要如何设置才可以让其充电到100%呢&#xff1f; 右下角…...

Unity接入PS5手柄和Xbox手柄以及Android平台的(以及不同平台分析)

Unity接入PS5手柄和Xbox手柄以及Android平台的&#xff08;以及不同平台分析&#xff09; 介绍Unity手柄小知识PC端和编辑器上的摇杆事件和滑动事件PS5手柄Xbox手柄北通手柄 安卓环境下&#xff08;安卓手机或者安卓模拟器&#xff09;PS5手柄Xbox手柄北通手柄 总结 介绍 最近…...

vue+java实现简易AI问答组件(基于百度文心大模型)

一、需求 公司想要在页面中加入AI智能对话功能&#xff0c;故查找免费gpt接口&#xff0c;最终决定百度千帆大模型&#xff08;进入官网、官方文档中心&#xff09;&#xff1b; 二、主要功能列举 AI智能对话&#xff1b;记录上下文回答环境&#xff1b;折叠/展开窗口&#…...