底层文件操作的各种函数(二)------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    小闭

                       

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

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

相关文章

MQ:延迟队列

6.1场景&#xff1a; 1.定时发布文章 2.秒杀之后&#xff0c;给30分钟时间进行支付&#xff0c;如果30分钟后&#xff0c;没有支付&#xff0c;订单取消。 3.预约餐厅&#xff0c;提前半个小时发短信通知用户。 A -> 13:00 17:00 16:30 延迟时间&#xff1a; 7*30 * 60 *…

PG事务、事务隔离级别、并发控制

事物与并发控制 ################################## 事物是关系型数据库中非常重要的概念。 并发通常能带来更大的吞吐量、资源利用率和更好的性能。 当多个事物并发执行时,即使每个单独的事物都正确的执行,数据库的一致性可能被破坏。为了控制并发事物之间的相互影响,解…

专栏开篇 | 虚拟直播软件的技术架构与应用场景分析

系列文章 技术探索 特征点检测 如何在前端项目中使用opencv.js | opencv.js入门如何使用tensorflow.js实现面部特征点检测tensorflow.js 如何从 public 路径加载人脸特征点检测模型tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图tensorflow.js 使用…

GB/T 28181标准中的错误码,国标28181中可能出现的SIP协议相关的错误码及其含义

目录 一、GB/T 28181标准介绍 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;关键内容和特点 1. 系统架构&#xff1a; 2. 设备接入&#xff1a; 3. 网络通信&#xff1a; 4. 业务功能&#xff1a; 5. 安全保护&#xff1a; 6. 平台管理&#xff1a; &a…

【C语言】字符串函数和内存函数及其模拟实现

文章目录 前言 一、常见字符串库函数1.strlen函数2.长度不受限制的字符串函数2.1 strcpy2.2 strcat2.3 strcmp 3.长度受限制的字符串函数3.1 strncpy3.2 strncat3.3 strncmp 二、字符串查找函数strstrstrtok 三、strerror函数四、内存操作函数1.memcpy2.memmove3.memcmp 五、字…

力扣刷题 二叉树层序遍历相关题目II

NO.116 填充每个节点的下一个右侧节点指针 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;…

jieba分词的应用

使用jieba分词的目的主要是将连续的中文文本切分成独立的词汇单元&#xff0c;以便进行后续的文本分析和处理。jieba分词是中文文本处理中的一个重要步骤&#xff0c;特别适用于中文等没有明显词汇边界的语言。 jieba分词的应用场景非常广泛&#xff0c;包括但不限于以下几个方…

iOS开发如何更改xcode中的Apple ID

在Xcode中更改Apple ID是一项常见的任务&#xff0c;尤其是当你需要切换到另一个开发者账号或者团队时。下面是一个简单的步骤指南&#xff0c;帮助你更改Xcode中的Apple ID&#xff1a; 步骤一&#xff1a;退出当前的Apple ID 1.打开Xcode应用程序。 2.在菜单栏中&#xff0c;…

外贸公司应该怎么选择企业邮箱?哪个企业邮箱最好?

外贸公司业务的特殊性需要他们频繁进行跨国的沟通交流&#xff0c;那么外贸公司应该如何选择适合的企业邮箱呢&#xff1f;首先&#xff0c;传输邮件的稳定安全是前提&#xff0c;另外由于沟通多是国外客户&#xff0c;邮件的翻译也成为外贸公司企业邮箱的刚需。小编今天就详细…

冒泡排序算法实现步骤

算法实现的过程&#xff1a; 1. 定义问题&#xff1a; - 算法是用来解决某一特定计算问题的方法步骤。例如&#xff0c;对于排序问题&#xff0c;我们需要一个算法对一组无序的整数进行排序。 2. 设计算法&#xff1a; - 冒泡排序是一种基础的排序算法。它的设计思路是…

Android 应用启动过程

Android应用的完全启动过程 用户点击应用图标后&#xff0c;Android应用的完全启动过程包括以下步骤&#xff1a; 启动器图标点击&#xff1a;用户点击应用程序的图标&#xff0c;触发启动器&#xff08;Launcher&#xff09;加载应用程序的入口Activity。 启动器加载&#x…

代码随想录训练营18day-二叉树7

一、530.二叉搜索树的最小绝对差 利用二叉搜索树的有序性&#xff0c;每一层遍历时候&#xff0c;最小差一定是在相邻的两个节点间产生的&#xff0c;因此做递归的时候&#xff0c;记录一个pre和cur节点&#xff0c;用来比较差值&#xff0c;迭代更新时候&#xff0c;记录最小…

ARMv8-A架构下的外部debug模型之外部调试事件(external debug events)概述

外部调试器与处理器之间的握手与external debug events 一&#xff0c;External Debug的使能二&#xff0c;外部调试器和CPU之间的握手三&#xff0c;外部调试事件 External debug events1. External debug request event2. Halt instruction debug event3. Halting step debug…

docker部署安装整理

centos下安装部署docker 在CentOS下部署Docker&#xff0c;你需要按照以下步骤进行操作&#xff1a; 更新系统&#xff1a; 首先&#xff0c;确保你的CentOS系统是最新的。打开终端&#xff0c;并运行以下命令来更新你的系统&#xff1a; sudo yum update -y安装所需的软件包…

[C++/Linux] UNIX域函数

目录 一.什么是UNIX域套接字&#xff1f; 二.如何使用UNIX域函数进行套接字编程&#xff1f; 三.利用socketpair函数进行文件描述符传递 3.1 socketpair函数 3.2 实例 3.3 补充消息结构知识 一.什么是UNIX域套接字&#xff1f; Unix域套接字&#xff08;Unix Domain Socke…

程序“猿”高阶函数

高阶函数是函数式编程的一个核心概念&#xff0c;它提供了强大的抽象能力&#xff0c;使得代码更加简洁和模块化。正如你所提到的例子&#xff0c;高阶函数可以接受其他函数作为参数&#xff0c;或者返回一个函数。这种特性让它们在处理列表操作、事件处理、异步编程等场景中非…

【力扣一刷】代码随想录day38(动态规划part1:509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼)

目录 【动态规划理论基础】 【509. 斐波那契数】简单题 方法一 用额外的数组存储每个状态 方法二 用2个遍历存储前两个状态&#xff08;减小空间复杂度&#xff09; 【70. 爬楼梯】简单题 【746. 使用最小花费爬楼】简单题 【动态规划理论基础】 1、定义&#xff1a;英…

代码随想录算法训练营第四十二天|leetcode121、122题

一、leetcode第121题 本题要求买卖股票一次获取最大利润&#xff0c;设置dp数组&#xff0c;其中dp[i][0]的含义是第i天持有股票的最大利润&#xff0c;dp[i][1]的含义是第i天不持有股票的最大利润&#xff0c;可得递推公式为dp[i][0]max(dp[i-1][0],-prices[i])&#xff0c;d…

A15 STM32_HAL库函数 之 FLASH扩展驱动 所有函数的介绍及使用

A15 STM32_HAL库函数 之 FLASH扩展驱动 所有函数的介绍及使用 1 FLASH扩展驱动 预览1.1 HAL_FLASHEx_Erase1.2 HAL_FLASHEx_Erase_IT1.3 HAL_FLASHEx_OBErase1.4 HAL_FLASHEx_OBProgram1.5 HAL_FLASHEx_OBGetConfig1.6 HAL_FLASHEx_OBGetUserData 该文档修改记录&#xff1a;总…

【从浅学到熟知Linux】环境变量详谈(含使用程序获取环境变量的3种方法、如何查看环境变量)

&#x1f3e0;关于专栏&#xff1a;Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程及数据库等内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 环境变量基本概念查看环境变量的方法环境变量相关命令环境变量组织方式及获取环境变量的3种方法验…