底层文件操作的各种函数(二)------printf,fprintf,sprintf,scanf,fscanf,sscanf的对比以及文件缓冲区

偷得几日清闲,又因一瞬之间对蹉跎时间的愧疚,由此而来到CSDN这个高手云集和新手求学的平台来也写上那么一篇博客。虽然自己的博客那么久不温不热,但坚持写作,巩固自己就好。今天要讲的是续接上一篇文章的补充与继续吧。上期文章:http://t.csdnimg.cn/HlpuYicon-default.png?t=N7T8http://t.csdnimg.cn/HlpuY

常常会回顾努力的自己,所以要给自己的努力留下足迹。

为今天努力的自己打个卡,留个痕迹吧

                                                                                                        2024.04.11     小闭
 

      


fprintf与fscanf

fpritf

将格式化数据写入流式处理

按格式指向的 C 字符串写入。如果 format 包含格式说明符(以 % 开头的子序列),则格式后面的其他参数将被格式化并插入到生成的字符串中,以替换其各自的说明符。

格式:

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

此函数所要包含的头文件如上图也是stdio.h。此函数与printf非常相似,只是多了个流的选择,也就是我们可以选择把要打印的东西打印到一个文件中。如下代码: 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int age = 18;
	char a[] = "Sam";
	double high = 188.8;
	FILE* pf = fopen("test0409.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
	}

	fprintf(pf, "名字:%s 年龄:%d 身高:%f", a, age, high);
	fclose(pf);
	pf = NULL;


	return 0;
}

我们一经运行,就可以打开文件目录,查看我们要打印的东西是否打印到我们的文本文件 

如上我们已经完成了打印。


 fscanf

中读取数据,并根据参数格式将它们存储到其他参数所指向的位置。

其他参数应指向已分配的对象,该对象的类型由格式字符串中的相应格式说明符指定。

这里我们把上面创建的test0409的文件改一下,便于fscanf读取,改后的文本如下 :

int main()
{
	int age ;
	char a[10] ;
	float high ;
	FILE* pf = fopen("test0409.txt", "r");//现在以只读的方式打开文件
	if (pf == NULL)
	{
		perror("fopen");
	}

	fscanf( pf,"%s %d %f", a,&age,&high);
	//看看是否完成读取了,打印出来。
	printf("名字:%s 年龄:%d 身高:%f", a, age, high);
	fclose(pf);
	pf = NULL;


	return 0;
}

如上面代码,我们现以”r“的方式打开文件,然后再让fscanf读取文本中对应占位符所对应的数据,并放到相应的变量中,最后再把这些变量打印再屏幕上

这里身高是不完全标准的,不是188.800000,而是 188.800003,为什么呢,这是因为这与浮点数的储存是有关系的,浮点数对有些数字是无法做到精确的储存的,至于为什么,大家可以看一下我前面写过的有关浮点数的文章:http://t.csdnimg.cn/FsTOTicon-default.png?t=N7T8http://t.csdnimg.cn/FsTOT


sprintf与sscanf

sprintf

将格式化数据写入字符串

使用与在 printf 上使用格式时打印的文本相同的文本组成一个字符串,但内容不是被打印,而是作为 C 字符串存储在 str 指向的缓冲区中。

缓冲区的大小应足够大,以包含整个生成的字符串

终止 null 字符会自动追加在内容之后。

在 format 参数之后,该函数至少需要与格式所需的附加参数一样多的参数。

简单点来说就是:将数据打印的地方从屏幕到一个指针(数组里)。

格式:

int sprintf ( char * str, const char * format, ... );
 

给大家举一个简单的代码例子:

这里我们现创建一个数组(足够能储存等下你要打印的数据),然后创建打印数据,然后其它正常像printf一样打印,只需前面多一个数组名(指针)。

int main()
{
	char a[100];
	int i = 18;
	int j = 180;
	char* q = "hello world";
	

		sprintf(a, "年龄:%d 起点:%s 理想身高:%d",i ,q ,j);
		printf("%s", a);

	return 0;
}

 如上我们打印数组a也是可以把刚刚fprintf的数据打印出来了,说明我们刚刚确实用fprintf打印到数组a中了。


sscanf 

从字符串中读取格式化数据

从 s 读取数据,并根据参数格式将它们存储到附加参数给定的位置,就像使用 scanf 一样,但从 s 读取而不是标准输入 (stdin)。



其他参数应指向已分配的对象,该对象的类型由格式字符串中的相应格式说明符指定。

int sscanf ( const char * s, const char * format, ...);

 这里也是简单示例一下:

我们这里从一个数组中读取数据放到另一个数组当中。

int main()
{
	char a[100] = {"helloworld"};
		char arr[100];
		sscanf(a, "%s",arr );
		printf("%s", arr);

	return 0;
}

 


printf,fprintf,sprintf,scanf,fscanf,sscanf的对比

首先最简单的scanf和printf

所用的流规定默认是标准输出流(stdout)和标准输入流(stdin),换句话来说就是:将数据输出到我们的屏幕上或从我们的屏幕读取数据。

fprintf和fscanf

所用的流可以是任何流,既可以是文件也可以是 标准输出流(stdout)和标准输入流(stdin),这里所用的流没有规定我们可以自由选择,需要作为参数传给函数,经过这么一解释,大家是否想说如果我们把 标准输出流(stdout)传给sprintf,把标准输入流(stdin)传给sscanf,是不是就是我们常用的printf和scanf了呢,答案确实是如此,所以你可以理解fprintf和fscanf只是多了选择流的权力。

这里给大家演示一下吧。

int main()
{
	int i = 0;
	printf("输入一个整数");
	fscanf(stdin, "%d", &i);

	fprintf(stdout,"%d", i);
	return 0;
}

 

这里也是从屏幕上输入,再屏幕输出,OK,这两个函数就是这样了。


sprintf与sscanf

这两个函数就是将数据传入数组或从一个数组中读取数据,简单来说就是他们操作的对象是数组而不是流。


文件缓冲区

文件缓冲区,我们可以把他想象为一个水桶,而我们拿这个水桶来接水,而我们接水需要到一定的水量我们才拿走的不然一次拿一点水不够用,需要一次一次来打水太浪费时间,除非有人强制我们拿走这桶水。而我们的缓冲区便是如此。

 可能大家会说,可是我们之前写的数据也是一点点,但还是把数据写入文件了,并没有像你所说要等缓冲区满了才会放入文件中,其实上面也说到一个“除非”,那就是被去强制写入硬盘文件里了,那什么操作会强制呢,其中之一那便是fclose,也就是关闭文件的操作会将缓冲区的数据输出到硬盘。还有一个fflush函数,也可以刷新缓冲区,也就是强制将数据输出或输入。


常常会回顾努力的自己,所以要给自己的努力留下足迹。

为今天努力的自己打个卡,留个痕迹吧

                                                                                                        2024.04.11    小闭

                       

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

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

相关文章

2024年第十五届蓝桥杯C++B组个人解

2024年第十五届蓝桥杯CB组 A: 握手问题&#xff08;5分&#xff09;问题描述思路 B: 小球反弹&#xff08;5分&#xff09;问题描述思路 C: 好数&#xff08;10分&#xff09;问题描述输入格式输出格式样例输入1样例输出1样例输入2样例输出2样例说明评测用例规模与约定思路 博客…

[大模型]BlueLM-7B-Chat langchain 接入

BlueLM-7B-Chat langchain 接入 模型介绍 BlueLM-7B 是由 vivo AI 全球研究院自主研发的大规模预训练语言模型&#xff0c;参数规模为 70 亿。BlueLM-7B 在 C-Eval 和 CMMLU 上均取得领先结果&#xff0c;对比同尺寸开源模型中具有较强的竞争力(截止11月1号)。本次发布共包含…

【Linux学习笔记】安卓运行C可执行文件No such file or directory

文章目录 开发环境运行失败现象解决办法方法一&#xff1a;使用静态库方法二&#xff1a;使用动态库创建lib查找依赖库复制需要注意的事情 开发环境 开发板&#xff1a;正点原子RK3568开发板安卓版本&#xff1a;11可执行程序命名&#xff1a;ledApp需加载模块&#xff1a;dts…

需求工程分析

概述 需求获取 结构化需求表分析&#xff08;SA&#xff09; 数据流图&#xff08;DFD&#xff09; E-R 图 状态转换图 数据字典 补充说明 面相对象 UML(重要) 面向对象 类图 顺序图 用例图 关系 活动图 状态图 通信图

Redis入门到通关之String命令

文章目录 ⛄1 String 介绍⛄2 命令⛄3 对应 RedisTemplate API❄️❄️ 3.1 添加缓存❄️❄️ 3.2 设置过期时间(单独设置)❄️❄️ 3.3 获取缓存值❄️❄️ 3.4 删除key❄️❄️ 3.5 顺序递增❄️❄️ 3.6 顺序递减 ⛄4 以下是一些常用的API⛄5 应用场景 ⛄1 String 介绍 Stri…

Linux的学习之路:9、冯诺依曼与进程(1)

摘要 本章主要是说一下冯诺依曼体系结构和进程的一部分东西。 目录 摘要 一、冯诺依曼体系结构 二、操作系统的概念 三、设计OS的目的 四、管理 五、进程的基本概念 六、PCB 七、在Linux环境下查看进程 八、使用代码创建进程 九、思维导图 一、冯诺依曼体系结构 如…

[C++][算法基础]Dijkstra求最短路径I(稠密图)

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为正值。 请你求出 1 号点到 n 号点的最短距离&#xff0c;如果无法从 1 号点走到 n 号点&#xff0c;则输出 −1。 输入格式 第一行包含整数 n 和 m。 接下来 m 行每行包含三个整…

监控服务zabbix的部署

监控服务zabbix部署 文章目录 监控服务zabbix部署1. zabbix介绍2. zabbix特点3. zabbix配置文件4. 部署zabbix4.1apache安装4.2mysql安装php安装(yum方式)4.3php安装&#xff08;源码方式&#xff09;4.4配置apache代理4.5zabbix安装4.6zabbix服务端配置4.7zabbix服务端web界面…

【2024年5月备考新增】《软考真题分章练习(含答案解析) - 18 管理科学-运筹学基础 (2)》

21、某种商品价格 P 变动与某指标 A 的变化具有很强的相关性,指标 A 的增长会导致 P 的降低,反之亦然。指标 A 和价格 P 的相关性系数是()。 A.0.18 B.0 C.0.98 D.-0.83 【答案】D 【解析】A 的增长会导致 B 的降低,反比关系,系数必然是一个负数。正比函数 y=kx,当 k>…

Linux知识点(3)

文章目录 11. 进程间通信11.1 管道11.1.0 |11.1.1 匿名管道11.1.2 命名管道11.1.3 用匿名管道形成进程池 11.2 system V共享内存11.2.1 system V函数11.2.2 system 命令 11.3 system V消息队列11.4 system V 信号量 12. 进程信号12.1 前台进程和后台进程12.1.1 jobs12.1.2 fg &…

Golang | Leetcode Golang题解之第25题K个一组翻转链表

题目&#xff1a; 题解&#xff1a; func reverseKGroup(head *ListNode, k int) *ListNode {hair : &ListNode{Next: head}pre : hairfor head ! nil {tail : prefor i : 0; i < k; i {tail tail.Nextif tail nil {return hair.Next}}nex : tail.Nexthead, tail my…

Linux 使用 ifconfig 报错:Failed to start LSB: Bring up/down networking

一、报错信息 在运行项目时报错数据库连接失败&#xff0c;我就想着检查一下虚拟机是不是 Mysql 服务忘了开&#xff0c;结果远程连接都连接不上虚拟机上的 Linux 了&#xff0c;想着查一下 IP 地址看看&#xff0c;一查就报错了&#xff0c;报错信息&#xff1a; Restarting…

【排序 贪心】3107. 使数组中位数等于 K 的最少操作数

算法可以发掘本质&#xff0c;如&#xff1a; 一&#xff0c;若干师傅和徒弟互有好感&#xff0c;有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二&#xff0c;有无限多1X2和2X1的骨牌&#xff0c;某个棋盘若干格子坏了&#xff0c;如何在没有坏…

读所罗门的密码笔记19_治理模式

1. 解决方案 1.1. 全球人工智能的环境错综复杂&#xff0c;它严重依赖于价值观&#xff0c;且关系重大 1.2. 即使是与大家同仇敌忾的问题做斗争&#xff0c;也往往无法在国际社会中取得最佳效果 1.3. OPCW&#xff08;禁止化学武器组织&#xff09;已经帮助限制了化学武器的…

编曲知识17:音高修正 节奏修正 压缩器应用 压缩数值算法

34届音高修正 节奏修正 压缩器应用 压缩数值算法独立音乐人训练营基地,七年在线教育编曲系统授课,培养了几千名独立音乐人https://app8epdhy0u9502.pc.xiaoe-tech.com/detail/l_660be2e3e4b023c02af7abbc/4?course_id=course_2XLKtQnQx9GrQHac7OPmHD9tqbv 修音 准备工作 …

005Node.js模块URL的使用

引入 URL 模块 要使用 URL 模块&#xff0c;首先需要在代码中引入它。可以使用以下代码将 URL 模块导入到你的脚本中&#xff1a; const url require(url);实例代码 const urlrequire(url); var apihttp://www.baidu.com?nameshixiaobin&age20; console.log(url.parse(…

你的高佣副业不二之选,开始流量卡推广,一文看懂号卡推广

在这个信息化的时代&#xff0c;网络已成为人们生活中不可或缺的一部分。然而&#xff0c;在享受着便捷与高效的同时&#xff0c;我们也必须面对一个现实问题&#xff0c;也就是高昂的流量费用。为了解决这一困扰广大用户的痛点&#xff0c;我们今天带来了一个极具吸引力的机会…

CLIP模型入门

简介 CLIP&#xff08;Contrastive Language-Image Pre-Training&#xff09;是OpenAI在2021年初发布的多模态预训练神经网络模型&#xff0c;用于匹配图像和文本。该模型的关键创新之一是将图像和文本映射到统一的向量空间&#xff0c;通过对比学习的方式进行预训练&#xff…

C语言中抽象的编译和链接原理

今天04.12&#xff0c;身体小有不适&#xff0c;但是睡不着觉&#xff0c;秉着不能浪费时间的原则&#xff0c;现在就简单写一下有关我们C语言中编译和链接的大体过程吧&#xff0c;因为编译和链接是比较抽象的&#xff0c;而且内容是比较底层&#xff0c;我们这里就简单了解它…

MySQL进阶-合

目录 1.使用环境 2.条件判断 2.1.case when 2.2.if 3.窗口函数 3.1.排序函数 3.2.聚合函数 3.3.partiton by ​​​​​​​3.4.order by 4.排序窗口函数 5.聚合窗口函数 1.使用环境 数据库&#xff1a;MySQL 8.0.30 客户端&#xff1a;Navicat 15.0.12 MySQL进阶…