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

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

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


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

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


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,为什么呢,这是因为这与浮点数的储存是有关系的,浮点数对有些数字是无法做到精确的储存的

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函数,也可以刷新缓冲区,也就是强制将数据输出或输入。


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

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

目录
相关文章
|
人工智能 JavaScript 搜索推荐
宜搭融合 DeepSeek R1 满血版!手把手教你玩转低代码 AI 产品
AI技术的迅猛发展,特别是DeepSeek的推出,为企业带来了前所未有的智能化体验。当低代码平台与AI技术结合时,迸发出丰富的应用场景。本文详细介绍如何通过宜搭平台使用DeepSeek,涵盖网页版、AI助理版、AI生成组件、连接器等功能,帮助用户轻松实现智能化业务系统。
1922 7
宜搭融合 DeepSeek R1 满血版!手把手教你玩转低代码 AI 产品
|
机器学习/深度学习 人工智能 自然语言处理
《解锁自监督学习:元应用数据标注难题》
在元应用开发中,数据标注是构建强大模型的基石,但传统监督学习面临高昂成本和人为误差等挑战。自监督学习通过挖掘数据内在信息、设计前置任务(如图像旋转预测、掩码语言模型),打破对人工标注的依赖,提升模型泛化能力。结合数据增强技术和半监督学习,利用少量标注与大量未标注数据,进一步优化模型性能。多模态自监督学习则融合文本、图像、音频等多源数据,减少单一模态标注需求。这些创新策略为元应用开发提供了高效解决方案,推动智能数字体验的发展。
321 1
|
存储 分布式计算 Hadoop
|
人工智能 自然语言处理 小程序
云端微光,AI启航:低代码开发的智造未来
在技术革新飞速发展的浪潮中,低代码开发与AI技术的结合正在重塑编程的边界。通过亲身体验腾讯云开发 Copilot,本篇文章从初学者视角出发,深度探索了从需求输入到功能实现的整个流程。Copilot 的自然语言解析能力和模块化设计,不仅缩短了开发周期,更让非技术背景的用户也能轻松迈入技术世界。AI 的加持使开发效率倍增,需求转化更加精准;然而,复杂场景中的生成代码质量和高级功能支持也存在优化空间。文章总结了AI辅助开发的技术优势、应用场景与未来发展方向,并探讨了开发者角色在智能化时代的转型,致力于为读者呈现一
517 3
云端微光,AI启航:低代码开发的智造未来
|
监控 网络协议 网络安全
ssh服务中如何批量管理100多台机器(Paramiko、 psutil模块)、跳板机(堡垒机)
ssh服务中如何批量管理100多台机器(Paramiko、 psutil模块)、跳板机(堡垒机)
|
人工智能 监控 安全
巧用通义灵码助力护网面试
护网行动是公安部组织的网络安全评估活动,通过模拟攻防演练提升企事业单位安全防护能力。自2016年起,涉及单位逐年增加,网络安全已成为业务保障必需。行动分为红蓝两队,红队模拟攻击,蓝队负责防御。在面试中,蓝队工程师岗位分为初级、中级和高级,要求包括漏洞分析、应急响应和安全设备操作。通义灵码作为AI工具,可用于面试准备,如分析日志、撰写脚本和辅助报告撰写,提高应聘者表现。红队面试侧重实战经验,如渗透测试和漏洞利用,通义灵码也可在代码审查和策略规划上提供帮助。请遵守中国国家网络安全法!!!网络不是法外之地!!!
|
数据采集 存储
4个步骤:如何使用 SwiftSoup 和爬虫代理获取网站视频
本文介绍了如何使用SwiftSoup库和爬虫代理技术抓取网站视频资源。通过安装SwiftSoup、获取HTML内容、解析HTML以提取视频链接,以及设置爬虫代理来绕过访问限制,可以实现高效、灵活的视频资源获取。示例代码展示了一个完整的过程,包括下载并存储视频文件到设备。结合这两种技术,可以有效应对网站访问挑战,方便地获取互联网视频资源。
927 3
4个步骤:如何使用 SwiftSoup 和爬虫代理获取网站视频
|
Web App开发 监控 网络协议
QUIC 简介及 NodeJs 简单示例
QUIC协议是一个新的通讯协议,基于 UDP 的传输协议并希望最终取代所有基于TCP的HTTP请求。熟悉 UDP 的人都应该清楚为什么要使用 QUIC。UDP 是的特点是不可靠、数据包经常丢失、重新排序、重复等等。UDP 不包括任何更高级别协议(如 HTTP)严格要求的 TCP 的可靠性和顺序保证,这就是 QUIC 的用武之地。
987 0
QUIC 简介及 NodeJs 简单示例
Vite 项目中如何去集成 Mock 环境 (插件:vite-plugin-mock)
Vite 项目中如何去集成 Mock 环境 (插件:vite-plugin-mock)
741 0
|
开发工具 git
Git使用经验总结4-撤回上一次本地提交
Git使用经验总结4-撤回上一次本地提交
370 0