C语言:文件操作(中)

片头

嗨!小伙伴们,大家好!在上一篇中,我们学习了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.mfbz.cn/a/584219.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过window的bash创建vue架构的项目文件,如何不用下载即可引用想要的图片

winr 通过window的bash创建vue架构的项目文件 先创建项目文件 用vscode打开并下载依赖 关于安装包版本小知识补充 例如 “^5.2.0”第一位是大版本号&#xff0c;第二位是小版本号&#xff0c;最后一位是补丁号 “^”尖括号指限定了只能下载大版本号为5的版本 “~4.17.21” …

ssm092基于Tomcat技术的车库智能管理平台+jsp

车库智能管理平台设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本车库智能管理平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短…

[机器学习系列]深入解析K-Means聚类算法:理论、实践与优化

目录 一、KMeans (一)Kmeans简介 (二)Kmeans作用和优点 (三)Kmeans局限和缺点 (四)Kmeans步骤 (五)如何选取最佳的K值的三种方法 (六)手肘法和目标函数的变化两种确定K值方法的区别 (七)如何选取第一次迭代的K个类中心------KMeans方法 (八)KMeans的常用参数介绍 二、…

CSS + HTML

目录 一.CSS&#xff08;层叠样式表&#xff09; 二. CSS 引入方式 三.选择器 3.1 标签选择器 3.2 类选择器 3.3 id选择器 3.4 通配符选择器 3.5 画盒子 四.文字控制属性 4.1字体大小 4.2字体粗细 4.3 字体倾斜 4.4行高 4.5行高--垂直居中 4.6 字体族 4.7 字体复…

智能优化算法及 MATLAB 实现(书籍推荐)

智能优化算法及 MATLAB 实现&#xff08;书籍推荐&#xff09; 介绍前言目录第1章 粒子群优化算法原理及其MATLAB实现第2章 哈里斯鹰优化算法原理及其MATLAB实现第3章 沙丘猫群优化算法原理及其MATLAB实现第4章 鲸鱼优化算法原理及其MATLAB实现第5章 大猩猩部队优化算法原理及其…

算法设计与分析 3.2 牛顿法及改进、迭代法、矩阵谱半径、雅可比迭代、高斯迭代

思考题1 改进cosx&#xff1f;优化算法 关键点在于cos计算过于麻烦&#xff0c;而每次都要求sinx的值 故直接简化为cosx的导数 -sinx 即&#xff1a; 原&#xff1a;//double daoshu(double x) { // return 18 * x - cos(x); //} 改&#xff1a;double daoshu(double x) {retu…

数字旅游打造个性化旅程,科技让旅行更贴心:数字技术根据旅行者需求定制专属行程,让每一次旅行都充满惊喜与贴心服务

一、引言 随着科技的飞速发展和数字化转型的深入推进&#xff0c;数字旅游正逐渐成为现代旅行的新趋势。它借助数字技术&#xff0c;根据旅行者的个性化需求&#xff0c;为其量身打造专属的旅程&#xff0c;让每一次旅行都充满惊喜与贴心服务。数字旅游不仅提升了旅行的便捷性…

如何编写测试用例

总结 测试用例需求来源 文档 用户角度 编写测试用例步骤 分析需求 写测试点 对需求的拆分 辅助完成测试用例的编写 编写测试用例 编写测试用例原则 能看懂 能执行 测试结果状…

【STM32 IIC通信与温湿度传感器AHT20(I2C_AHT20)】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 最终效果展示AHT20温湿度传感器&#xff08;I2C_AHT20&#xff09; 1、工程配置2、代码如果您发现文章有错误请与我留言&#xff0c;感谢 最终效果展示 详细讲解视频…

Excel 批量获取sheet页名称,并创建超链接指向对应sheet页

参考资料 用GET.WORKBOOK函数实现excel批量生成带超链接目录且自动更新 目录 一. 需求二. 名称管理器 → 自定义获取sheet页名称函数三. 配合Index函数&#xff0c;获取所有的sheet页名称四. 添加超链接&#xff0c;指向对应的sheet页 一. 需求 ⏹有如下Excel表&#xff0c;需…

【如何使用SSH密钥验证提升服务器安全性及操作效率】(优雅的连接到自己的linux服务器)

文章目录 一、理论基础&#xff08;不喜欢这部分的可直接看具体操作&#xff09;1.为什么要看本文&#xff08;为了zhuangbility&#xff09;2.为什么要用密钥验证&#xff08;更安全不易被攻破&#xff09;3.密码验证与密钥验证的区别 二、具体操作1.生成密钥对1.1抉择&#x…

数据库|TiDB-Server API的高效应用指南

一、API介绍 1.Status 显示TiDB 连接数、版本和git_hash 信息 tidb-server_ip:status_port/status { "connections": 0, "version": "5.7.25-TiDB-v6.1.1", "git_hash": "5263a0abda61f102122735049fd0dfadc7b7f822" } 2.St…

Ollama +Docker+OpenWebUI

1 Ollama 1.1 下载Ollama https://ollama.com/download 1.2 运行llama3 $ ollama run llama3 pulling manifest pulling 00e1317cbf74... 100% ▕███████████████████████████████████████████████████████████…

SD-WAN的核心竞争力有哪些?

随着企业网络需求的飞速增长&#xff0c;SD-WAN作为一种新兴网络连接方式&#xff0c;正迅速受到企业的青睐。SD-WAN不仅仅是连接手段&#xff0c;更是网络优化、安全防护和综合管理的集大成技术。在这篇文章中&#xff0c;我们将简要探讨SD-WAN的核心竞争力&#xff0c;以帮助…

Flink checkpoint 源码分析

序言 最近因为工作需要在阅读flink checkpoint处理机制&#xff0c;学习的过程中记录下来&#xff0c;并分享给大家。也算是学习并记录。 目前公司使用的flink版本为1.11。因此以下的分析都是基于1.11版本来的。 在分享前可以简单对flink checkpoint机制做一个大致的了解。 …

mysql-sql-练习题-4-标记

标记 连续登录2-7天用户建表排名找规律 最大连胜次数建表只输出连胜结果输出所有连续结果 连续登录2-7天用户 建表 create table continuous_login(user_id1 integer comment 用户id,date_login date comment 登陆日期 ) comment 用户登录表;insert into continuous_login val…

这是一个简单网站,后续还会更新

1、首页效果图 代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>爱德照明网站首页</title> <style> /*外部样式*/ charset "utf-8"…

【计算机毕业设计】基于SSM++jsp的社区管理与服务系统【源码+lw+部署文档+讲解】

目录 摘 要 Abstract 第一章 绪论 第二章 系统关键技术 第三章 系统分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3运行可行性 3.1.4法律可行性 3.4.1注册流程 3.4.2登录流程 3.4.3活动报名流程 第四章 系统设计 4.3.1登录模块顺序图 4.3.2添加信息模块顺序图 4.4.1 数据库E-…

使用STM32CubeMX对STM32F4进行串口配置

目录 1. 配置1.1 Pin脚1.2 RCC开启外部晶振1.3 时钟1.4 串口配置 2. 代码2.1 默认生成代码2.1 开启串口中断函数2.3 接收中断2.4 接收回调函数2.5 增加Printf 的使用 1. 配置 1.1 Pin脚 1.2 RCC开启外部晶振 1.3 时钟 外部使用8MHz晶振 开启内部16MHz晶振 使用锁相环 开启最高…

动手写一个简单的Android 表格控件支持固定列

Android 动手写一个简洁版表格控件 简介 源码已放到 gitee 作为在测绘地理信息行业中穿梭的打工人&#xff0c;遇到各种数据采集需求&#xff0c;既然有数据采集需求&#xff0c;那当然少不了数据展示功能&#xff0c;最常见的如表格方式展示。 当然&#xff0c;类似表格这些…
最新文章