Linux 文件操作-标准IO函数3- fread读取、fwrite写入、 fprintf向文件写入格式化数据、fscanf逐行读取格式化数据的验证

目录

1. fread 从文件中读取数据

1.1 读取次数 × 每次读取字节数 < 原内容字节数

1.2 读取次数 × 每次读取字节数 > 原内容字节数

2.fwrite 向文件中写入数据

2.1写入字符串验证

2.2写入结构体验证

3. fprintf 将数据写入到指定文件

4. fscanf 从文件中逐行读取内容,并将其存储在结构中

4.1 读取整形、浮点型、字符程序:

4.2 读取结构体程序:

4.2.1读取 空格 间隔数据

4.2.2读取 空格-空格 间隔数据

5.fprintf 和 fscanf 联合使用


1. fread 从文件中读取数据

函数原型:

/* 功能:从文件中读取数据
参数:
ptr:保存读取的数据
size:每次读取的字节数
nmemb:一共读取的次数
stream:文件指针返回值:成功:实际读取的次数(对象数、块数)失败:0如果文件内容读取完毕,返回0 */
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

1.1 读取次数 × 每次读取字节数 < 原内容字节数

程序:file.txt 共32个字节,程序读取3次,每次6个字节,共18个字节。

#include <stdio.h>int test1()
{FILE *fp = NULL;//只读打开 file.txtfp = fopen("./file.txt", "r");if(fp == NULL){printf("fail to fopen\n");return -1;}//使用fread函数读取文件内容int num;char buf[64] = {0};//从fp中读取3次数据,每次读取6个字节,保存到bufnum = fread(buf, 6, 3, fp);printf("buf = %s\n", buf);printf("num = %d\n", num);if(num == 0){printf(" fail to fread \n", num);}fclose(fp);  	 	return 0;
}int main(int argc, char *argv[])
{test1();return 0;
}

运行结果:

1.2 读取次数 × 每次读取字节数 > 原内容字节数

 例: fread(buf, size, num, fp); //读取num次,每次size个字节大小。

若:如果读到 n*size 个字节,返回值为 n 

.....
 如果读到了大于等于2*size 个字节, 小于3*size个字节, 返回值为 2
 读到的字节数,大于等于size 个字节 ,小于2*size个字节, 返回值为 1
 不到size 个字节,返回值为 0 


int num = fread(str,10,3,fp);
读取的字节数为 ,每次读取10个字节,读3次, 返回值为num。


 如果读到30个字节,返回值num为3
 如果读到了大于等于20个字节,小于30个字节, 返回值为2
 读到的字节数,大于等于10个字节,小于20个字节 返回值为1
 不到10个字节,返回值为0

程序:

#include <stdio.h>int test1()
{FILE *fp = NULL;//只读打开 file.txtfp = fopen("./file.txt", "r");if(fp == NULL){printf("fail to fopen\n");return -1;}//使用fread函数读取文件内容int num;char buf[64] = {0};//从fp中读取3次数据,每次读取6个字节,保存到bufnum = fread(buf, 30, 3, fp);printf("buf = %s\n", buf);printf("num = %d\n", num);if(num == 0){printf(" fail to fread \n", num);}fclose(fp);  	 	return 0;
}int main(int argc, char *argv[])
{test1();return 0;
}

运行结果:修改程序每次读取字节数

(1)num = fread(buf, 30, 3, fp);

(2)num = fread(buf, 15, 3, fp);

(3)num = fread(buf, 35, 3, fp);

2.fwrite 向文件中写入数据

函数原型:

/*功能:向文件中写入数据
参数:
ptr:要写入的数据
size:一次写入的字节数
nmemb:一共写入的次数
stream:文件指针返回值:成功:实际写入的次数失败:0 */
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

2.1写入字符串验证

程序:

#include <stdio.h>
#include <string.h>int test1()
{FILE *fp = NULL;//读写打开 file.txt,不存在创建,存在清0fp = fopen("./file.txt", "w+");if(fp == NULL){printf("fail to fopen\n");return -1;}int num;char buf[] = {"hello world"};//向fp中写入3次数据,每次写入strlen(buf)个字节,num = fwrite(buf, strlen(buf), 3, fp);printf("strlen(buf) = %d\n", strlen(buf));printf("fwrite num = %d\n", num);printf("fwrite size = %d\n", num*strlen(buf));//向文件写入字节大小if(num == 0){printf(" fail to fwrite \n", num);}//将文件的偏移量设置为文件的起始位置rewind(fp);//使用fread函数读取文件内容char buf1[128] = {0};//从fp中读取3次数据,每次读取strlen(buf)个字节,保存到buf1num = fread(buf1, strlen(buf), 3, fp);printf("fread num = %d\n", num);printf("buf1  = %s\n", buf1);printf("strlen(buf1) = %d\n", strlen(buf1));if(num == 0){printf(" fail to fread \n", num);}fclose(fp);  	 	return 0;}int main(int argc, char *argv[])
{test1();return 0;
}

运行结果:对file.txt写入3次hello world ,每次写入11个字节

2.2写入结构体验证

程序:

#include <stdio.h>
#include <string.h>typedef struct{int i1;int i2;char c1;char c2;
}DATA;int test2()
{FILE *fp = NULL;fp = fopen("./file1.txt", "w+");if(fp == NULL){printf("fail to fopen\n");return -1;}//使用fwrite向文件写入一个结构体DATA data[3] = {1, 2, 'a', 'b', 3, 4, 'c', 'd', 5, 6, 'e', 'f',};//向fp写入3次数据,每次sizeof(DATA)个字节int num = fwrite(data, sizeof(DATA), 3, fp);printf("fwrite num = %d\n", num);//将文件的偏移量设置为文件的起始位置,不设为起始,读取位置将从写入最后一个字节之后开始。rewind(fp);DATA read_data[3];//从fp读取写入数据,每次sizeof(DATA)个字节,读取3次数据int num1 = fread(read_data, sizeof(DATA), 3, fp);printf("fread num = %d\n", num1);int j;for(j = 0; j < 3; j++) //循环读取read_data数据{printf("%d - %d - %c - %c\n", read_data[j].i1, read_data[j].i2, read_data[j].c1,  read_data[j].c2);}fclose(fp);  	 	return 0;
}int main(int argc, char *argv[])
{test2();return 0;
}

运行结果:

3. fprintf 将数据写入到指定文件

函数原型:

/*  fprintf 和printf函数类似:printf是将数据输出到屏幕上(标准输出),fprintf函数是将数据输出到文件指针所指定的文件中。 *//* 参数‌:
stream:文件指针,指定输出目标(如文件、stdout、stderr)。
format:格式化字符串,定义输出格式(如 %d, %s, %f)。
...:可变参数列表,对应 format 中的格式说明符。
‌返回值‌:成功时返回写入的字符数,失败时返回负值。 */int fprintf(FILE *stream, const char *format, ...);

程序:

#include <stdio.h>
#include <string.h>int test1()
{char ch='a';int num=10;char str[20]="hello world";float score = 68.9;FILE *fp = NULL;//读写打开 file.txtfp = fopen("./file.txt", "w+");if(fp == NULL){printf("fail to fopen\n");return -1;}//使用fprintf向文件写入字符串int num1 = fprintf(fp,"%c %d %s %f\n",ch,num,str,score);printf("fprintf num = %d\n", num1);if(num1 < 0){printf(" fail to fprintf \n");return -1;}fclose(fp);  	 	return 0;
}int main(int argc, char *argv[])
{test1();return 0;
}

运行结果:

4. fscanf 从文件中逐行读取内容,并将其存储在结构中

函数原型:

 /* fscanf和scanf 函数类似:scanf是从键盘(标准输入)获取输入,fscanf是从文件指针所标示的文件中获取输入。 *//* 参数‌:
stream:文件指针(如 FILE *fp 或 stdin)‌。
format:格式字符串,定义输入数据的格式(如 %d, %s, %f)‌。
...:可变参数列表,需为变量地址(如 &num, name 数组名)‌ ‌返回值‌:
成功时,返回输入数据格式数量‌(%d %s 等成功读取的个数)。
失败或 文件结尾返回 EOF(即 -1)‌ */int fscanf(FILE *stream, const char *format, ...)

4.1 读取整形、浮点型、字符程序:

#include <stdio.h>
#include <string.h>int test1()
{     char ch;int num;char str[32] = "";float score ;FILE *fp = NULL;//追加读写打开 file.txtfp = fopen("./file.txt", "r");if(fp == NULL){printf("fail to fopen\n");return -1;}//将文件的偏移量设置为文件的起始位置,不设为起始,读取位置将从写入最后一个字节之后开始。//rewind(fp);//从指定文件读取数据int num1 = fscanf(fp,"%c %d %s %f\n", &ch, &num, &str, &score);printf("ch= %c num= %d str= %s score= %f\n", ch, num, str, score);printf("fprintf num1 = %d\n", num1);if(num1 == EOF){printf(" fprintf fail or end \n");return -1;}return 0;
}int main(int argc, char *argv[])
{test1();fclose(fp);return 0;
}

运行结果:

file.txt原有内容:

4.2 读取结构体程序:

4.2.1读取 空格 间隔数据

程序:

#include <stdio.h>
#include <string.h>typedef struct
{char name[32];int age;   int score;
}DATA;int test2()//循环读取文件内容
{FILE *fp = NULL;//只读打开 file.txtfp = fopen("./file1.txt", "r");if(fp == NULL){printf("fail to fopen\n");return -1;}DATA dt;//从指定文件循环读取一行数据while(fscanf(fp, "%s %d %d\n", dt.name,  &dt.age, &dt.score) == 3) //char name[32];{printf("name= %s age= %d score= %d\n", dt.name, dt.age, dt.score );}fclose(fp);return 0;
}int main(int argc, char *argv[])
{test2();	return 0;
}

运行结果:

注意fscanf第二个参数要与文件数据格式保持一致。

fscanf(fp, "%s %d %d", dt.name,  &dt.age, &dt.score);

4.2.2读取 空格-空格 间隔数据

程序:

#include <stdio.h>
#include <string.h>typedef struct
{char name[32];int age;   int score;
}DATA;int test2()//循环读取文件内容
{FILE *fp = NULL;//只读打开 file.txtfp = fopen("./file1.txt", "r");if(fp == NULL){printf("fail to fopen\n");return -1;}DATA dt;//fprintf 和 fscanf 联合使用,fprintf写入文本时加入\n,在fscanf读取时也要加\n。
//单独使用fscanf读取多行数据时,可不加\n//从指定文件循环读取一行数据while(fscanf(fp, "%s - %d - %d", dt.name,  &dt.age, &dt.score) == 3)//while(fscanf(fp, "%s - %d - %d\n", dt.name,  &dt.age, &dt.score) == 3){printf("name= %s age= %d score= %d\n", dt.name, dt.age, dt.score );}fclose(fp);return 0;
}int main(int argc, char *argv[])
{test2();	return 0;
}

运行结果:注意fscanf第二个参数要与文件数据格式保持一致。

fscanf(fp, "%s - %d - %d", dt.name, &dt.age, &dt.score);

5.fprintf 和 fscanf 联合使用

程序:

#include <stdio.h>
#include <string.h>int test4()//
{FILE *fp = NULL;//读写打开 file.txtfp = fopen("./file.txt", "w+");if(fp == NULL){printf("fail to fopen\n");return -1;}int num = 0;char ch1 = 'a', ch11;int i1 = 1, i11;char ch2 = 'e', ch22;int i2 = 10, i22;int j = 0;for(j = 0;j < 3;j++){//使用fprintf向文件写入字符串num = fprintf(fp,"%c %d %c %d\n",ch1 + j, i1 + j, ch2 + j, i2 + j);if(num < 0){printf("fail to fprintf\n");}}//将文件的偏移量设置为文件的起始位置,不设为起始,读取位置将从写入最后一个字节之后开始。rewind(fp);//fprintf 和 fscanf 联合使用,fprintf写入文本时加入\n,在fscanf读取时也要加\n。
//单独使用fscanf读取多行数据时,可不加\n//从指定文件循环读取一行数据//while(fscanf(fp, "%c %d %c %d\n",&ch11 , &i11 , &ch22 , &i22) == 4) {printf("read:%c %d %c %d\n", ch11 , i11 , ch22 , i22 );}fclose(fp);return 0;
}int main(int argc, char *argv[])
{test4();return 0;
}

运行结果:

注意:(1)写入文件后,将偏移量移至文件开头。 // rewind(fp);

(2)程序写入了 \n;

fprintf(fp,"%c %d %c %d\n",ch1 + j, i1 + j, ch2 + j, i2 + j);

读取时也要加:

while(fscanf(fp, "%c %d %c %d\n",&ch11 , &i11 , &ch22 , &i22) == 4) 

(3)//fprintf 和 fscanf 联合使用,fprintf写入文本时加入\n,在fscanf读取时也要加\n。

//单独使用fscanf读取多行数据时,可不加\n

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

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

相关文章

再学:abi编码 地址类型与底层调用

目录 1.内置全局变量及函数 2.abi 3.地址类型 4.transfer 1.内置全局变量及函数 2.abi data就是abi编码 abi描述&#xff1a;以json格式表明有什么方法 3.地址类型 4.transfer x.transfer:合约转给x call 和 delegatecall 是 Solidity 中用于底层合约调用的函数&#xff0…

解决前端文字超高度有滚动条的情况下padding失效(el-scrollbar)使用

<div class"detailsBlocksContent"><div>测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试…

SpringCloud 学习笔记3(OpenFeign)

OpenFeign 微服务之间的通信方式&#xff0c;通常有两种&#xff1a;RPC 和 HTTP。 简言之&#xff0c;RPC 就是像调用本地方法一样调用远程方法。 在 SpringCloud 中&#xff0c;默认是使用 HTTP 来进行微服务的通信&#xff0c;最常用的实现形式有两种&#xff1a; RestTem…

c中<string.h>

常见错误与最佳实践 缓冲区溢出&#xff1a; strcpy 和 strcat 不检查目标缓冲区大小&#xff0c;需手动确保空间足够。替代方案&#xff1a;使用 strncpy 和 strncat&#xff0c;或动态分配内存&#xff08;如 malloc&#xff09;。 未终止的字符串&#xff1a; 确保字符串以…

C++动态规划从入门到精通

一、动态规划基础概念详解 什么是动态规划 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一种通过将复杂问题分解为重叠子问题&#xff0c;并存储子问题解以避免重复计算的优化算法。它适用于具有以下两个关键性质的问题&#xff1a; 最优子结构&…

TypeScript + Vue:类风格组件如何引领前端新潮流?

&#x1f680; TypeScript Vue&#xff1a;用类风格组件打造“假货比对”神器&#xff01;&#x1f31f; 2025 年&#xff0c;前端开发早已进入“类型安全 模块化”的黄金时代。TypeScript (TS) 的类风格组件正在席卷 Vue 社区&#xff0c;为开发者带来更优雅、更强大的编码体…

Odoo 18 中的列表(list) 、表单(Form)、数据透视表、图表视图、看板视图、活动视图、日历视图等综合应用实例

Odoo 18 中的 视图应用实例 在 Odoo 中&#xff0c;视图是用户界面中表示业务对象的重要组成部分。无论您是扩展现有功能还是创建全新的功能&#xff0c;业务对象都至关重要。这些对象通过不同类型的视图向用户展示&#xff0c;而 Odoo 会根据 XML 描述动态生成这些视图。 列…

【Linux】Bash是什么?怎么使用?

李升伟 整理 什么是 Bash&#xff1f; Bash&#xff08;Bourne Again Shell&#xff09;是一种 命令行解释器&#xff08;Shell&#xff09;&#xff0c;广泛用于 Unix 和 Linux 操作系统。它是 Bourne Shell&#xff08;sh&#xff09; 的增强版&#xff0c;提供了更多的功能…

Golang开发

Golang 文章目录 Golang预备技术一、算法与数据结构第1章&#xff1a;基础算法第2章&#xff1a;数据结构第3章&#xff1a;搜索与图论第4章&#xff1a;数论第5章&#xff1a;动态规划第6章&#xff1a;贪心第7章&#xff1a;算法竞赛入门 二、Linux操作系统与Shell编程三、计…

AI +低代码平台实现个性化用户体验设计

目录 一、引言 二、低代码平台与用户体验现状 &#xff08;一&#xff09;低代码平台的普及与应用 &#xff08;二&#xff09;传统低代码平台用户体验的局限性 三、AI 在个性化用户体验设计中的关键作用 &#xff08;一&#xff09;用户行为分析与洞察 &#xff08;二&a…

synchronized与 Java内置锁(未写完)

文章目录 一、 synchronized 关键字二、Java对象结构1. 对象头2. 对象体3. 对齐字节4. 对象头中的字段长度5. Mark Word 的结构信息6. 使用 JOL 工具查看对象的布局 三、Java 内置锁机制演进过程1. 无锁状态2. 偏向锁状态3. 轻量级锁状态4. 重量级锁状态 一、 synchronized 关键…

【MySQL数据库】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法

在DQL的基础查询中&#xff0c;我们已经学过了多表查询的一种&#xff1a;联合查询&#xff08;union&#xff09;。本文我们将系统的讲解多表查询。 笛卡尔积现象 首先&#xff0c;我们想要查询emp表和stu表两个表&#xff0c;按照我们之前的知识栈&#xff0c;我们直接使用…

网易云信架构升级实践,故障恢复时间缩至8秒

一、项目背景 网易云信是网易旗下集IM与音视频技术于一体的PaaS服务平台&#xff0c;为全球提供融合通信与视频的核心功能和组件&#xff0c;包括IM即时通讯、短信、信令等通信服务&#xff0c;以及RTC、直播、点播、互动直播、互动白板等音视频服务&#xff0c;此外&#xf…

[HelloCTF]PHPinclude-labs超详细WP-Level 1-FILE协议

源码分析 <?php include("get_flag.php");isset($_GET[wrappers]) ? include("file://".$_GET[wrappers]) : ;highlight_file(__FILE__); ?>第一句 include("get_flag.php");, 使代码包含了 get_flag.php 的内容 大概是生成 Flag 之类的…

MongoDB 可观测性最佳实践

MongoDB 介绍 MongoDB 是一个高性能、开源的 NoSQL 数据库&#xff0c;它采用灵活的文档数据模型&#xff0c;非常适合处理大规模的分布式数据。MongoDB 的文档存储方式使得数据结构可以随需求变化而变化&#xff0c;提供了极高的灵活性。它支持丰富的查询语言&#xff0c;允许…

4.angular 服务

服务是在controller里面引入的服务&#xff1a; 最好是内部服务在前面&#xff0c;自定义服务在后面 内部服务 $scope $scope.$watch(‘属性名’, function(newVal, oldVal) {}, true) true是深度监听,对象函数等$scope.$apply 触发页面更新,里面传入回调函数,比如说之前那个…

HarmonyOS NEXT开发进阶(十二):build-profile.json5 文件解析

文章目录 一、前言二、Hvigor脚本文件三、任务与任务依赖图四、多模块管理4.1 静态配置模块 五、分模块编译六、配置多目标产物七、配置APP多目标构建产物八、定义 product 中包含的 target九、拓展阅读 一、前言 编译构建工具DevEco Hvigor&#xff08;以下简称Hvigor&#x…

【强化学习基石】Deepseek V3技术报告中的GRPO算法是什么?

1. Deepseek V3技术报告中的GRPO算法是什么? GRPO(Generalized Relative Policy Optimization)是一种在强化学习领域用于策略优化的算法。它主要是在策略梯度方法的基础上进行改进,目的是更有效地优化策略网络,从而提高智能体在环境中的表现。 GRPO 的核心思想是通过相对…

VSCode C/C++ 开发环境完整配置及常见问题(自用)

这里主要记录了一些与配置相关的内容。由于网上教程众多&#xff0c;部分解决方法并不能完全契合我遇到的问题&#xff0c;因此我选择以自己偏好的方式&#xff0c;对 VSCode 进行完整的配置&#xff0c;并记录在使用过程中遇到的问题及解决方案。后续内容也会持续更新和完善。…

Billu_b0x靶机攻略

1&#xff0c;安装好靶机并打开&#xff0c;打开kali进行扫描得到靶机ip为192.168.50.138 2&#xff0c;访问靶机以及扫描出的目录 3&#xff0c;访问test.php发现file参数为空&#xff0c;尝试拼接其他路径来访问&#xff0c;发现可以file传参&#xff0c;利用插件进行post传参…