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

文件的读写

所涉及到的函数如下:<stdio.h>

函数介绍网站:cplusplus.com - The C++ Resources Network

读写文件之前要先打开文件,使用完要关闭文件归返空间:

fopen    打开

fclose   关闭

返回的是FILE*型,第一个参数是文件的名字,第二个参数是以什么形式打开。

一、写入一个字符

第一个参数是要写进的字符,第二个是目标地址,写进一次会前进一次,不会直接覆盖在第一个

#include<stdio.h>
#include<string.h>
#include<errno.h>// 写一个字符 "A"
int main()
{// 以写的形式打开 名为test.txt的文件FILE* p = fopen("test.txt", "w");// 判断是否成功if (p == NULL){printf("%s\n", strerror(errno));return 1;}// 写入一个字符 fputc('A', p);//再写一个foutc('B',p);//关闭文件fclose(p);p = NULL;return 0;
}

二、读出一个字符

从stream 里面读取一个字符,返回值就是这个字符,如果读到尾部或者发生错误,会返回EOF

// 读一个字符
int main()
{// 以读的形式打开FILE* p = fopen("test.txt","r");// 判断是否成功if (p == NULL){printf("%s\n", strerror(errno));return 1;}// 读取一个字符char pc = fgetc(p);printf("%c\n", pc);//关闭文件fclose(p);p = NULL;return 0;
}

三、写入一行文本

“w” 形式打开文件会清除里面原有的信息

将 str 指向的数据拷贝到 stream指向的地址,直到读到  '\0'

int main()
{// 以写的形式打开一个文件FILE* pt = fopen("test.txt", "w");// 判断是否成功if (pt == NULL){printf("%s\n", strerror(errno));return 1;}// 写入字符串char arr[] = "hello ";fputs(arr,pt);fputs("baby!\n", pt);// 此时文件里面 只有hello 和 baby!// 关闭文件fclose(pt);pt = NULL;return 0;
}

四、读一行文本

跟 fputs 差不多,多了一个限制,num 是读取个数,读到n-1 处或者读到新的一行停止

int main()
{// 以读的形式打开一个文件FILE* pt = fopen("test.txt", "r");// 判断是否成功if (pt == NULL){printf("%s\n", strerror(errno));return 1;}// 读取char arr[] = {0};fgets(arr, 10, pt);printf("%s", arr);// 关闭文件fclose(pt);pt = NULL;return 0;
}

五、格式化输出

(输入输出都是相对于内存的,打印到文件里,相当于输出;从文件获取信息,相当于输入)

跟printf 类似,多了一个输出的对象,就是格式化将数据打印到 stream 指向的文件里

struct ps
{char arr[20];int i;float f;
};int main()
{struct ps x = { "mylove",20,1.68f };// 打开文件,写的形式FILE* op = fopen("test.txt", "w");//判断 是否成功if (op == NULL){perror("fopen");return 1;}// 写入文件(打印到文件)fprintf(op, "%s %d %f", x.arr, x.i, x.f);// 打印到屏幕 (stdout 是标准输出流,【屏幕】)fprintf(stdout, "%s %d %f", x.arr, x.i, x.f);// 关闭文件fclose(op);op = NULL;return 0;
}

六、格式化输入

类似 scanf  ,从stream指向的文件,按照format的格式化读出数据

struct ps
{char arr[20];int i;float f;
};
int main()
{struct ps bobo = {0};// 打开文件 读rFILE* qp = fopen("test.txt", "r");// 判断……// 读 文件内容fscanf(qp, "%s %d %f", bobo.arr, &(bobo.i), &(bobo.f));printf("%s %d %f", bobo.arr, bobo.i, bobo.f);// 关闭文件fclose(qp);qp = NULL;return 0;
}

七、二进制输出(只针对于文件)

prt指向的对象是 被掏空的对象,stream指向的是要收获的对象

size 是输出元素的大小

count  是输出的个数

struct Peo
{char name[20];int age;float high;
};// fwrite  二进制写  "wb"int main()
{struct Peo s = { "lisi",20,180.5f };//打开文件FILE* ps = fopen("test.txt", "wb");//判断是否成功……// 写入fwrite(&s, sizeof(struct Peo), 1, ps);//关闭文件fclose(ps);ps = NULL;return 0;
}

八、二进制输入

参数和 fwrite函数 一样,不过这次风水轮流转,是从 stream指向的里面复制一份给ptr指向的地方

struct Peo
{char name[20];int age;float high;
};int main()
{struct Peo rp = { 0 };//打开文件FILE* pp = fopen("test.txt", "rb");// 判断……// 读入数据fread(&rp, sizeof(rp), 1, pp);printf("%s %d %f", rp.name, rp.age, rp.high);return 0;
}

scanf 、printf 家族大比拼
scanf针对 标准输入 的格式化输入语句
printf针对 标准输出 的格式化输出语句
fscanf针对 所有输入流 的格式化输入语句
fprintf针对 所有输出流 的格式化输出语句
sscanf从一个字符串中转化出一个格式化的数据
sprintf把一个格式化的数据转化为字符串

FILE* stdin标准输入流(键盘)
FILE* stdout标准输出流(屏幕)
FILE* stderr标准错误流(屏幕)

九、文件的随机读写

1、fseek 函数

根据 文件指针的偏移量和位置定位文件指针

2、ftell 函数

计算偏移量(以文件头作为参照)

【什么是偏移量?】,就是相当于最开始的位置左移右移多少。

3、rewind  函数

回到文件头

//1、fseek 根据文件指针的偏移量和位置来定位文件指针
//2、ftell计算偏移量  
//3、rewind 回到文件起始位置
int main()
{// 打开文件FILE* pc = fopen("test.txt", "r");// 判断if (pc == NULL){perror("fopen");return 1;}// 文件内容:ABCDEFGHIJKLMN!//  偏移3,从最开始fseek(pc,2, SEEK_SET);int ar = fgetc(pc);printf("%c\n", ar);// 偏移2,从现在的位置fseek(pc,2, SEEK_CUR);ar = fgetc(pc);printf("%c\n", ar);// 偏移3,从末尾开始fseek(pc, -6, SEEK_END);ar = fgetc(pc);printf("%c\n", ar);// 计算偏移量printf("%d\n", ftell(pc));// 返回最初的位置rewind(pc);ar = fgetc(pc);printf("%c\n", ar);// 关闭文件fclose(pc);pc = NULL;return 0;
}

结果:C   F   L   12    A

fgetc 函数的特点:读取一个字符后往后走一步。

十、文件读取结束的判定

文件文本读取是否结束,判断返回值

fgetc

 判断是否为  EOF

fgets判断是否为  NULL
fread判断返回值是否  小于实际要读取的个数

feof 函数 &&  ferror 函数

结束的原因
feof判断 是不是 到  末尾  
ferror判断 是不是  遇到  错误

// feof && ferrorint main()
{char arr[20] = { 0 };// 打开文件 二进制读FILE* pc = fopen("test.txt", "rb");// 判断……//读取int n=fread(arr, 1, 5, pc);if (n == 5){// 不一定读取到末尾puts("读取成功\n");}else{// n!= 5, 说明读取结束,末尾或者发生错误if (feof(pc))printf("读到末尾\n");else if (ferror(pc))printf("发生错误,读取失败\n");}// 关闭文件fclose(pc);pc = NULL;return 0;
}

十一、文件缓冲区

如果想要赶快将数据送入文件里,可以刷新缓冲区 【fflush 函数】,

关闭文件(fclose)时也会刷新缓冲区。

相关文章:

文件的读写

所涉及到的函数如下&#xff1a;<stdio.h> 函数介绍网站&#xff1a;cplusplus.com - The C Resources Network 读写文件之前要先打开文件&#xff0c;使用完要关闭文件归返空间&#xff1a; fopen 打开 fclose 关闭 返回的是FILE*型&#xff0c;第一个参数是文…...

城市大脑新型智慧城市数据中台建设方案

建设背景与现状 随着城市化进程的加速&#xff0c;城市数据呈现出爆炸式增长&#xff0c;但数据的整合、共享和利用却面临诸多挑战。信息孤岛、数据冗余、管理分散等问题日益突出&#xff0c;制约了智慧城市的发展。为了解决这些问题&#xff0c;构建城市大脑新型智慧城市数据…...

二三(Node2)、Node.js 模块化、package.json、npm 软件包管理器、nodemon、Express、同源、跨域、CORS

1. Node.js 模块化 1.1 CommonJS 标准 utils.js /*** 目标&#xff1a;基于 CommonJS 标准语法&#xff0c;封装属性和方法并导出*/ const baseURL "http://hmajax.itheima.net"; const getArraySum (arr) > arr.reduce((sum, item) > (sum item), 0);mo…...

【sgFileLink】自定义组件:基于el-link、el-icon标签构建文件超链接组件,支持垃圾桶删除、点击预览视频/音频/图片/PDF格式文件

sgFileLink源代码 <template><div :class"$options.name"><el-link click.stop"clickFile(data)"><img :src"getSrc(data)" /><span>{{ getFileNameAndSize(data) }}</span></el-link><el-linkcl…...

Kafka - 消息乱序问题的常见解决方案和实现

文章目录 概述一、MQ消息乱序问题分析1.1 相同topic内的消息乱序1.2 不同topic的消息乱序 二、解决方案方案一&#xff1a; 顺序消息Kafka1. Kafka 顺序消息的实现1.1 生产者&#xff1a;确保同一业务主键的消息发送到同一个分区1.2 消费者&#xff1a;顺序消费消息 2. Kafka 顺…...

【golang】匿名内部协程,值传递与参数传递

代码例子 下面代码的区别是直接调用循环变量&#xff0c;这里使用的就是这个变量的引用&#xff0c;而不是将参数的副本传递给协程执行 for task : range taskChan {wg.Add(1)go func() {defer wg.Done()task.Do() // 使用外部循环变量}() }func DistributeTasks(taskChan &…...

Jenkins与SonarQube持续集成搭建及坑位详解

Jenkins和SonarQube都是软件开发过程中常用的工具,它们在代码管理、构建、测试和质量管理方面发挥着重要作用。以下是关于Jenkins与SonarQube的作用及整合步骤环境搭建的详细解释: 一、Jenkins与SonarQube的作用 Jenkins: Jenkins是一个开源的持续集成和交付工具,它可以帮…...

.NET6 WebAPI从基础到进阶--朝夕教育

1、环境准备 1. Visual Studio 2022 2. .NET6 平台支持 3. Internet Information Services 服务器&#xff08; IIS &#xff09; 4. Linux 服务器 【 CentOS 系统】 ( 跨平台部署使用 ) 5. Linux 服务器下的 Docker 容器&#xff08; Docker 部署使用&#xff09; …...

购物车案例--分模块存储数据,发送请求数据渲染,底部总计数量和价格

shift鼠标右键&#xff0c;打开powershell&#xff0c;新建项目 自定义 只有一个页面&#xff0c;不涉及路由&#xff0c;勾选vuex,css,babel 无需保存预设 回车项目开始创建 项目用vscode打开 将src里的内容全部清空 将第七天的课程准备代码复制粘贴到src中 刷新页面&…...

PCIe学习笔记

PCIE高速串行数据总线 当拿到一块板子 比如你要用到PCIE 首先要看这块板子的原理图 一般原理图写的是 PCI express 表示PCIE 以下是Netfpga为例下的PCIE插口元件原理图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/01dc604fbdc847e8998a978c83c7b2eb.png 一般主…...

The Rise and Potential of Large Language ModelBased Agents:A Survey---讨论

讨论 论法学硕士研究与Agent研究的互利性 近年来&#xff0c;随着激光诱导金属化技术的发展&#xff0c;激光诱导金属化与化学剂交叉领域的研究取得了长足的进步&#xff0c;促进了这两个领域的发展。在此&#xff0c;我们期待着LLM研究和Agent研究相互提供的一些益处和发展机…...

C语言:const的用法

有时候我们希望定义这样一种变量&#xff0c;它的值不能被改变&#xff0c;在整个作用域中都保持固定。例如&#xff0c;用一个变量来表示班级的最大人数&#xff0c;或者表示缓冲区的大小。为了满足这一要求&#xff0c;可以使用 const 关键字对变量加以限定&#xff1a; con…...

Redis - 集合 Set 及代码实战

Set 类型 定义&#xff1a;类似 Java 中的 HashSet 类&#xff0c;key 是 set 的名字&#xff0c;value 是集合中的值特点 无序元素唯一查找速度快支持交集、并集、补集功能 常见命令 命令功能SADD key member …添加元素SREM key member …删除元素SCARD key获取元素个数SI…...

LabVIEW面向对象编程有什么特点?

LabVIEW面向对象编程&#xff08;OOP&#xff09;的特点主要体现在它如何结合传统面向对象编程&#xff08;OOP&#xff09;的理念与LabVIEW的图形化编程模式&#xff0c;提供灵活的抽象和模块化的功能。以下是LabVIEW面向对象编程的几个主要特点&#xff1a; ​ 1. 类&#x…...

配置Nginx自签名SSL证书,支持HTTPS

配置Nginx自签名SSL证书的流程 生成一个SSL自签名证书客户端机器信任这个自签名证书修改RHEL服务器的Nginx配置在客户机用curl测试HTTPS 生成一个SSL自签名证书 在RHEL服务器上, 用openssl命令生成一个自签名证书 openssl genrsa -out server.key 2048 #生成一个2048位的RS…...

使用Spring Boot、VUE实现SSE长连接:跟踪文件上传和任务进度

使用Spring Boot实现SSE长连接&#xff1a;跟踪文件上传和任务进度 文章目录 使用Spring Boot实现SSE长连接&#xff1a;跟踪文件上传和任务进度什么是SSE&#xff1f;使用场景前端库选择安装event-source-polyfill1. 创建SSE连接2. 关闭SSE连接3. 结合Vue.js使用 使用Spring B…...

计算机网络技术基础:3.计算机网络的拓扑结构

网络拓扑结构是指用传输媒体互连各种设备的物理布局&#xff0c;即用什么方式把网络中的计算机等设备连接起来。将工作站、服务站等网络设备抽象为点&#xff0c;称为“节点”&#xff1b;将通信线路抽象为线&#xff0c;称为“链路”。由节点和链路构成的抽象结构就是网络拓扑…...

go-zero(十二)消息队列

go zero 消息队列 在微服务架构中&#xff0c;消息队列主要通过异步通信实现服务间的解耦&#xff0c;使得各个服务可以独立发展和扩展。 go-zero中使用的队列组件go-queue&#xff0c;是gozero官方实现的基于Kafka和Beanstalkd 的消息队列框架,我们使用kafka作为演示。 一、…...

会议通知:人工智能通识教育与实践发展暨和鲸科技AI通识课解决方案发布会

今年秋季学期起&#xff0c;全国多所高校面向本科生开设人工智能通识课。 当前人工智能通识课程的建设进展主要分为三种情况&#xff1a; 全市统筹&#xff0c;由某头部高校牵头建设市级人工智能通识课&#xff0c;以北京市、天津市为代表&#xff1b; 已于秋季学期按照课程…...

UDS自动化测试-Service 0x27(CAPL调用dll实现key计算)

文章目录 关联文章一、CANoe加载诊断数据库cdd、dll文件二、CAPLdiagGenerateKeyFromSeed关联文章 UDS - 深论Security Access Service 27服务-安全访问状态转换 CDD文件——CANdelaStudio Vector——CAPL语言设计 CANoe诊断测试 相信读者基于Diagnostic/ISO TP Confighratio…...

Mirage Flow 运维效率提升实战:智能日志排查与故障自愈方案

Mirage Flow 运维效率提升实战&#xff1a;智能日志排查与故障自愈方案 你是不是也经历过这样的深夜&#xff1f;告警短信突然炸了锅&#xff0c;几十上百条日志涌进来&#xff0c;你得像侦探一样&#xff0c;在成百上千行日志里大海捞针&#xff0c;试图找出那个导致系统崩溃…...

ADG实时同步失效的深层原因:从MRP0的WAIT_FOR_LOG状态看standby redolog设计要点

ADG实时同步失效的深层解析&#xff1a;从WAIT_FOR_LOG状态看SRL设计关键点 当Oracle Data Guard环境中MRP0进程陷入WAIT_FOR_LOG状态时&#xff0c;这就像高速公路上的应急车道被占用——整个容灾系统的实时同步能力将陷入瘫痪。本文将带您穿透现象看本质&#xff0c;从存储结…...

逻辑分析仪采样率设置玄学:用Acute 3134E抓eMMC信号时如何平衡精度与时长

逻辑分析仪采样率设置玄学&#xff1a;用Acute 3134E抓eMMC信号时如何平衡精度与时长 在消费电子维修和固件开发领域&#xff0c;捕获准确的eMMC信号波形往往决定着故障诊断的成败。Acute 3134E逻辑分析仪作为工程师手中的利器&#xff0c;其采样率设置却常被戏称为"玄学&…...

Unity3D RPG游戏开发:从零构建角色扮演游戏的核心系统

1. 环境准备与项目初始化 第一次打开Unity Hub时&#xff0c;新手常会被各种版本和选项搞得晕头转向。我建议直接安装最新的LTS版本&#xff08;比如2022.3&#xff09;&#xff0c;这个版本就像游戏界的"稳定版安卓系统"&#xff0c;既不会太老缺少功能&#xff0c;…...

智慧校园系统采购,如何平衡功能、价格与服务?

✅作者简介&#xff1a;合肥自友科技 &#x1f4cc;核心产品&#xff1a;智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…...

Could NOT find OpenSSL (missing: OPENSSL_LIBRARIES)

手动安装cmake&#xff0c;执行./bootstrap后出现标题所示错误提示&#xff0c;因为这一步出错&#xff0c;所以后面的步骤都无法继续进行 一开始以为是服务器上没有装openssl&#xff0c;使用openssl version命令发现有对应的版本&#xff0c;但是路径下没有include等文件夹 …...

OpenClaw多模型对比:Qwen3-14b_int4_awq与开源小模型任务表现

OpenClaw多模型对比&#xff1a;Qwen3-14b_int4_awq与开源小模型任务表现 1. 测试背景与动机 最近在折腾OpenClaw自动化工作流时&#xff0c;发现一个关键问题&#xff1a;同样的任务脚本&#xff0c;换不同的大模型后端&#xff0c;执行效果差异巨大。为了找到最适合个人办公…...

联邦蒸馏技术解析:从知识共享到隐私保护的实践路径

1. 联邦蒸馏技术&#xff1a;当知识共享遇上隐私保护 第一次听说"联邦蒸馏"这个词时&#xff0c;我正和团队在做一个医疗AI项目。医院的数据就像被锁在保险箱里的珍宝&#xff0c;谁都想要&#xff0c;但谁都拿不到。传统联邦学习虽然解决了数据不出本地的问题&#…...

Go语言的gRPC服务开发

Go语言的gRPC服务开发 1. gRPC简介 gRPC是Google开发的高性能、开源的RPC框架&#xff0c;基于HTTP/2协议和Protocol Buffers序列化格式。它支持多种语言&#xff0c;包括Go、Java、C、Python等&#xff0c;非常适合构建微服务架构。 gRPC的优势 高性能&#xff1a;基于HTTP/2协…...

云原生数据库的设计与实践:从架构到部署

云原生数据库的设计与实践&#xff1a;从架构到部署 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农&#xff0c;我深知云原生技术对数据库的影响。随着云计算的快速发展&#xff0c;云原生数据库已经成为数据库技术的重要发展方向。今天&#xff0c;我就来聊聊云原生数据库…...