C语言:文件操作(中)

news2024/12/23 14:24:11

片头

嗨!小伙伴们,大家好!在上一篇中,我们学习了C语言:文件操作(上),在这一篇中,我们将继续学习文件操作,准备好了吗?Ready Go ! ! !

 文件的顺序读写

来复习一下这个表格

函数名功能适用于
fgetc字符输入函数/读所有输入流(stdin-标准输入流和文件输入流)
fputc字符输出函数/写所有输出流(stdout-标准输出流和文件输出流)
fgets文本行输入函数所有输入流
fputs文本行输出函数所有输出流
fscanf格式化输入函数所有输入流
fprintf格式化输出函数所有输出流
fread二进制输入文件输入流
fwrite二进制输出文件输出流

在上一篇中,我们学习了fgetc、fputc、fgets、fputs函数,今天我们来讲解后面几个函数~

1 fprintf函数

fprintf函数是C语言标准库中的一个输出函数,用于将格式化的数据输出到指定的文件中。

函数声明如下:

int fprintf( FILE* stream,const char* format,.......);

 参数意义如下:

stream: 表示文件指针,用于指定输出的目标文件

format: 是一个格式化字符串,指定输出的格式

....... : 表示可变参数,用于提供要输出的数据

通过对比,我们可以观察到,fprintf函数和printf函数差不多, fprintf函数只不过多了一个参数FILE* stream,printf函数是将数据输出到标准输出流(stdout)【类似于:显示器界面(控制台)】,而fprintf函数是将数据输出到指向文件的指针stream(指针类型为 FILE*)中。

代码如下:

#include<stdio.h>
//创建一个结构体Stu
struct Stu {
	char name[20];
	int age;
	float score;
};

int main() {
	//定义一个结构体变量s,分别对属性进行初始化
	struct Stu s = { "zhangsan",24,98.00000 };
	//以“只写”的方式打开文件
	FILE* pfwrite = fopen("data.txt", "w");
	if (pfwrite == NULL) {
		perror("fopen->pfwite");
		return 1;
	}
	//将信息输出到流中
	fprintf(pfwrite,"%s %d %.1f", s.name, s.age, s.score);
	
	//关闭文件
	fclose(pfwrite);
	pfwrite = NULL;//置空
	return 0;
}

运行结果如下:

fprintf函数的返回值是成功输出的字符数。如果出现错误则返回负数。函数会根据format字符串中的格式指示符,将可变参数列表中的数据按照指定的格式输出到文件中。

2 fscanf函数

fscanf函数是C语言标准库中的一个输入函数,用于从文件中读取格式化的数据。它可以根据给定的格式字符串从文件中读取数据,并将读取到的数据存储到对应的变量中。

函数原型如下:

int fscanf(FILE* stream, const char* format, ...);

参数说明:
- stream:指向要读取的文件的指针。
- format:格式化字符串,指定了要读取的数据的格式。
- ...:可变参数,用来接收读取到的数据的变量。

通过对比,我们可以发现,其实 fscanf 函数和 scanf 函数差不多,fscanf函数只不过多了一个参数FILE* stream,scanf函数是从标准输入流(从键盘中)读取数据,fscanf函数是从指向文件的指针stream(指针类型为 FILE*)中读取数据。

代码如下:

#include<stdio.h>

//创建一个结构体Stu
struct Stu {
	char name[20];
	int age;
	float score;
};
int main() {
//定义一个结构体变量s,初始化为0
	struct Stu s = { 0 };
//以“只读”的模式,打开文件
	FILE* pfread = fopen("data.txt", "r");
//从文件中读取属性值
	fscanf(pfread,"%s %d %f", s.name, &(s.age), &(s.score));
//在控制台上打印属性值
	fprintf(stdout,"%s %d %.1f", s.name, s.age, s.score);

//关闭文件
	fclose(pfread);
	pfread = NULL;//置空

	return 0;
}

运行结果如下:

这样,我们就成功地使用fscanf函数从文件中读取了数据。需要注意的是,fscanf函数会按照格式化字符串中的格式要求进行读取,如果格式不匹配,可能会导致读取错误或结果不正确。因此,在使用fscanf函数时,要确保格式化字符串与文件中的数据格式相匹配。 

3 fwrite函数

fwrite函数是C语言中的一个文件操作函数,用于向文件中写入数据。

函数原型如下:

size_t fwrite( const void* ptr, size_t size,  size_t  count,  FILE* stream);

参数含义如下:

ptr: 指向要写入的数据的指针

size: 每个数据项的大小(以字节为单位) 

count: 要写入的数据项的个数

stream: 指向要写入的文件的指针

返回值: 成功写入数据的个数

fwrite函数将指定的数据写入文件,写入的数据来自指针ptr指向的内存区域。写入的数据项大小为size字节,总共写入count个数据项。函数调用成功后,返回实际写入的数据项个数,如果返回值与count不相等,可能是因为写入出错或到达文件末尾。

fwrite函数一般用于向二进制文件中写入数据,例如将内存中的结构体保存到文件中。它可以写入任意类型的数据,包括整数、浮点数、字符等。

代码如下:

//创建一个结构体Stu
struct Stu {
	char name[20];
	int age;
	float score;
};

int main() {
	//定义一个结构体变量s,分别对属性进行初始化
	struct Stu s = { "zhangsan",18,95.00000 };
	//以二进制的模式读和写
	FILE* pf = fopen("data.txt", "wb");
	if (pf == NULL) {
		perror("pf");
		return 1;
	}

	//二进制输出到流中
	fwrite(&s, sizeof(s), 1, pf);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

运行结果如下:

 

4 fread函数

 fread函数时C语言中的文件输入函数,用于从文件中读取指定数量的数据项,并将其存储到指定的内存块中。它的函数原型如下:

size_t fread(void* ptr,size_t size,size_t count,FILE* stream)

 参数说明:

ptr: 指向存储数据的内存块的指针。

size: 每个数据项的字节数。

count: 要读取的数据项的数量

stream: 文件指针,指向要读取的文件。

返回值:为实际读取的数据项数量。

fread函数按照指定的size和count来计算要读取的总字节数,并将这些字节从文件中读取到ptr指向的内存块中。读取的位置随着每次读取而向后移动。

fread函数常用于读取二进制文件,可以读取任意类型的数据。读取字符串时,需要注意字符串结束标志'\0'字符,因为fread函数不会自动追加字符串结束符。

代码如下:

//创建一个结构体Stu
struct Stu {
	char name[20];
	int age;
	float score;
};

//定义一个结构体变量s,初始化为0
int main() {
	struct Stu S = { 0 };
	FILE* pf = fopen("data.txt", "rb");
	if (pf == NULL) {
		perror("pf");
		return 1;
	}
	//以二进制的形式读文件
	fread(&S, sizeof(S), 1, pf);
	//输出属性值
	printf("%s %d %f\n", S.name, S.age, S.score);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

运行结果如下:

 片尾

今天我们学习了另外4个函数,分别是fprintf函数,fscanf函数,fwrite函数,fread函数,希望看完这篇文章能对友友们有所帮助!!!

点赞收藏加关注!!!

谢谢大家!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宽字符的来历:从ASCII到Unicode,C语言中的宽字符处理

目录 一、ASCII编码&#xff1a;字符世界的开篇 二、Unicode与宽字符的诞生 宽字符类型与宽字符串 三、C语言中的宽字符处理函数 四、宽字符与多字节字符 结语 在计算机科学的发展历程中&#xff0c;字符编码经历了从简单到复杂、从单一语言到全球多语种支持的演变过程。…

【AGX】Ubuntu20.04 + ROS_ noetic+ 大疆Mid360激光 雷达评测

大家好&#xff0c;我是虎哥&#xff0c;最近组装机器人&#xff0c;使用到了大疆孵化的圳市览沃科技有限公司&#xff08;简称Livox览沃科技&#xff09;推出的觅道系列全新混合固态激光雷达Mid-360&#xff0c;顺便试试效果&#xff0c;也记录一下使用入门过程。 "觅道M…

323_C++_QT_使用QProcess执行cmd解压tar.gz等等其他压缩包文件到指定目录,不需要外部库,QT自带API的就行

// decompressPath : 解压到此目录 // fileName : 解压的tar.gz文件名executeCommand(decompressPath , QString::fromStdString(fileName));// 开始解压 void executeCommand

基于Springboot的医疗服务系统

基于SpringbootVue的医疗服务系统设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 公告信息 医疗地图 医疗药品 普通村民管理 乡村医生管理 公告信息管理 乡村诊…

Microsoft Access Database使用

“小规模数据用Excel&#xff0c;大规模数据用Access。” 当涉及到大规模数据时&#xff0c;使用excel非常的卡顿&#xff0c;使用access就不会出现这个问题。 一、常用操作 1.新建一个数据库 直接右键&#xff0c;新建 access数据库 2.excel内容导入到access中&#xff08;成…

基于H.264的RTP打包中的组合封包以及分片封包结构图简介及抓包分析;FU-A FU-B STAP-A STAP-B简介;

H.264视频流的RTP封装类型分析&#xff1a; 前言&#xff1a; 1.RTP打包原则&#xff1a; RTP的包长度必须要小于MTU(最大传输单元)&#xff0c;IP协议中MTU的最大长度为1500字节。除去IP报头&#xff08;20字节&#xff09;、UDP报头&#xff08;8字节&#xff09;、RTP头&a…

unittest_parameterized批量测试测试用例

import unittest from parameterized import parameterizeddef add(x, y):return xy"""问题&#xff1a;如果有三组数据需要测试&#xff1f;[(1,1,2), (1,2,3), (0,3,3)] """def get_data():return [(1, 2, 3), (3, 0, 3), (2, 1, 3)]# 定义测试…

002 springCloudAlibaba Sentinel流控-关联

当与A关联的资源B达到阀值后&#xff0c;就限流A自己 文章目录 FlowLimitController.javaSentinelServerApplication.javaServletInitializer.javaapplication.yamlpom.xmlpom.xml 启动Sentinel8080 - java -jar sentinel-dashboard-1.7.0.jar 启动微服务8401 启动8401微服务…

微信开发api、微信视频号开发

接口地址&#xff1a; http://api.videostui.com/finder/v2/api/login/checkLogin 接口说明 获取到登录二维码后需每间隔5s调用本接口来判断是否登录成功新设备登录平台&#xff0c;次日凌晨会掉线一次&#xff0c;重新登录时需调用获取二维码且传appId取码&#xff0c;登录成…

OpenLayers入门①(引入的是一个高德地图)

OpenLayers入门&#xff08;一&#xff09; - 知乎 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&qu…

react 基于qrcode.react生成颜色不同 , 样式不同的二维码

实现效果: 1 首先在react中 , 导入下载qrcode.react npm install qrcode.react2 在react中导入使用 , 并导入ui样式 import QRcode1 from /assets/images/QRcode1.png import QRcode2 from /assets/images/QRcode2.png import QRcode3 from /assets/images/QRcode3.png impo…

【C 数据结构】图的存储结构

文章目录 【 1. 图的顺序存储结构 】1.1 基本原理1.2 顺序存储结构的 C 实现 【 2. 图的链式存储结构 】2.1 图的临接表存储结构2.1.1 临接表的 基本原理2.1.2 临接表的 链表节点2.1.3 邻接表 各结构体的C实现2.1.4 临接表 计算顶点的出度和入度邻接表计算 无向图的出度和入度邻…

JavaScript+C#云LIS系统源码JQuery+EasyUI+Bootstrap云LIS系统应用于哪些行业领域?区域云LIS系统源码

JavaScriptC&#xff03;云LIS系统源码JQueryEasyUIBootstrap云LIS系统应用于哪些行业领域&#xff1f;区域云LIS系统源码 云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序&#xff0c;可协助区域内所有临床实验室相互协调并完成日常检验工作&#xff0c;对区域内的检…

应用在电位器中的磁性旋转编码器芯片

电位器是具有三个引出端、阻值可按某种变化规律调节的电阻元件。电位器通常由电阻体和可移动的电刷组成。当电刷沿电阻体移动时&#xff0c;在输出端即获得与位移量成一定关系的电阻值或电压。电位器既可作三端元件使用也可作二端元件使用。后者可视作一可变电阻器&#xff0c;…

MATLAB中功率谱密度计算pwelch函数使用详解

MATLAB中功率谱密度计算pwelch函数使用详解 目录 前言 一、pwelch函数简介 二、pwelch函数参数说明 三、pxx pwelch(x)示例 四、[pxx,f]pwelch(x,window,noverlap,nfft,fs)示例 四、[pxx,f] pwelch(x,window,noverlap,nfft,fs,freqrange,spectrumtype)示例 五、多通道功…

CI/CD:基于kubernetes的Gitlab搭建

1. 项目目标 &#xff08;1&#xff09;熟悉使用k8s环境搭建Gitlab &#xff08;2&#xff09;熟练应用Gitlab基本配置 2. 项目准备 2.1. 规划节点 主机名 主机IP 节点规划 k8s-master 10.0.1.1 kube_master k8s-node1 10.0.1.2 kube_node k8s-node2 10.0.1.3 k…

Java 源码 - DelayQueue 源码解析

文章目录 1. 整体设计1.1 类注释1.2、类图1.3 延迟队列的属性1.4 DelayQueue 的主要方法1.4.1 offer 添加元素1.4.2 take 取出元素1.4.3 poll 取出元素 1. 整体设计 DelayQueue 延迟队列底层使用的是锁的能力&#xff0c;比如说要在当前时间往后延迟 5 秒执行&#xff0c;那么…

UnityWebGL获取话筒实时数据

看了木子李大佬的数字人https://digital.lkz.fit/之后&#xff0c;我也想搞一个&#xff0c;于是开始研究起来&#xff0c;先从WebGL录音开始&#xff0c;一共试了三个插件&#xff0c;个个都有问题…… 1、UnityWebGLMicrophone 用起来没啥问题&#xff0c;但是只能录音&#…

【百度Apollo】探索自动驾驶:Apollo 新版本 Beta 全新的Dreamview+,便捷灵活更丰富

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引入一、Dreamview介绍二、Dreamview 新特性2.1、基于模式的多场景——流程更简洁地图视角调节&#xff1a;调试流…

创业两个月以来我的思想感悟和日志记录

截止目前&#xff0c;出来创业差不多两个月时间了&#xff0c;写篇文章记录总结一下吧&#xff0c;给大家讲讲这两个来&#xff0c;我的感受和心路历程吧。 先来说说我为什么要出来创业&#xff0c;在如今市场环境这么差的情况下&#xff0c;很多身边的朋友都找不到工作&#…