底层文件操作的各种函数(二)------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.hqwc.cn/news/616291.html

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

相关文章

免费升级至HTTPS协议教程

一、前言 HTTPS协议以其安全性和数据加密特性&#xff0c;逐渐取代HTTP成为互联网通信的主流协议。本文将为您简洁明了地介绍如何免费升级至HTTPS协议。 二、获取免费SSL证书 选择证书提供商&#xff1a;如JoySSL等提供免费SSL证书的服务。 免费申请地址https://www.joyssl.…

太阳光光照试验耐久性老化试验使用太阳光模拟器系统

上海科迎法电气科技有限公司生产的太阳光模拟器系统主要应用于太阳能研究、材料研究、光伏组件测试、空间环境模拟器、植物生长研究、光热模拟等领域&#xff0c;主要表现特征为&#xff1a; 1. 太阳能研究&#xff1a;可用于模拟不同光照条件下太阳能电池的性能测试和研究&am…

Golang 开发实战day10 - Maps

&#x1f3c6;个人专栏 &#x1f93a; leetcode &#x1f9d7; Leetcode Prime &#x1f3c7; Golang20天教程 &#x1f6b4;‍♂️ Java问题收集园地 &#x1f334; 成长感悟 欢迎大家观看&#xff0c;不执着于追求顶峰&#xff0c;只享受探索过程 Golang 教程10 - Maps 1. M…

【计算机毕业设计】企业销售人员培训——后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

基于Python的深度学习的中文情感分析系统(V2.0),附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Mysql主从复制安装配置

mysql主从复制安装配置 1、基础设置准备 #操作系统&#xff1a; centos6.5 #mysql版本&#xff1a; 5.7 #两台虚拟机&#xff1a; node1:192.168.85.111&#xff08;主&#xff09; node2:192.168.85.112&#xff08;从&#xff09;2、安装mysql数据库 #详细安装和卸载的步骤…

阿里云优惠口令2024最新

2024年阿里云域名优惠口令&#xff0c;com域名续费优惠口令“com批量注册更享优惠”&#xff0c;cn域名续费优惠口令“cn注册多个价格更优”&#xff0c;cn域名注册优惠口令“互联网上的中国标识”&#xff0c;阿里云优惠口令是域名专属的优惠码&#xff0c;可用于域名注册、续…

28 番外3 文件硬链接简介

番外3 文件硬链接简介 你有没有想过一个并不引人瞩目的问题: 为什么我的文件图标会出现在电脑的特定位置呢?我什么我双击一下桌面上的一个word文件,计算机就能读取并打开这个文件呢?这个文件在哪里呢? 这个文件当然存储在我们的计算机硬盘里. 把硬盘比做一张白纸,那么这个.d…

问题汇总

一、TCP的粘包和拆包问题&#xff1f; TCP在发送和接受数据的时候&#xff0c;有一个滑动窗口来控制接受数据的大小&#xff0c;这个滑动窗口你就可以理解为一个缓冲区的大小。缓冲区满了就会把数据发送&#xff0c;数据包的大小是不固定的&#xff0c;有时候比缓冲区大有时候…

蓝桥杯简单STL

目录 vector vector定义 vector访问 常用函数 size() ​编辑 push_back(num) pop_back() clear 迭代器&#xff08;iterator) 迭代器定义 遍历数组示例 insert(it, element) erase(it) 标准模板库--STL&#xff0c;它包含了多种预定义的容器、算法和迭代器&…

【深度学习实战(3)】打印自己模型的推理帧率

一、FPS(每秒传输帧数-Frames Per Second) FPS就是目标网络每秒可以处理&#xff08;检测&#xff09;多少帧(多少张图片),FPS简单来理解就是图像的刷新频率&#xff0c;也就是每秒多少帧,假设目标检测网络处理1帧要0.02s&#xff0c;此时FPS就是1/0.0250 其中Processing tim…

Unity之C#面试题(二)

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之C#面试题&#xff08;二&#xff09; TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&a…