嵌入式Linux系统编程 — 2.3 标准I/O库:格式化I/O

目录

1 格式化I/O简介

2 格式化输出

2.1 格式化输出函数简介

2.2 格式控制字符串 format

2.3 示例程序

3 格式化输入

3.1 格式化输入简介

3.2 格式控制字符串 format

3.3 示例程序


1 格式化I/O简介

在先前示例代码中,经常使用库函数 printf() 来输出程序中的打印信息,printf() 函数能够将格式化的数据输出到标准输出设备,因此它通常被称为格式化输出函数。除了 printf(),还提供了其他几种格式化输出函数,包括 fprintf()dprintf()sprintf()snprintf()

与格式化输出相对应的是格式化输入,它允许从标准输入中获取格式化数据。格式化输入函数包括 scanf()fscanf()sscanf()

2 格式化输出

2.1 格式化输出函数简介

C 库函数提供了 5 个格式化输出函数,包括: printf()、 fprintf()、 dprintf()、 sprintf()、 snprintf(),其函数定义如下所示:

printf():将格式化的数据输出到标准输出(通常是终端或控制台)。

int printf(const char *format, ...);

fprintf():将格式化的数据输出到指定的文件,stream 参数可以是任何有效的文件指针。

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

dprintf():直接将格式化的数据写入到指定的文件描述符 fd

int dprintf(int fd, const char *format, ...);

sprintf():将格式化的数据写入到字符数组 str 中,这通常用于字符串操作。

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

snprintf():类似于 sprintf(),但增加了对输出缓冲区大小的限制,size 参数指定了最大可写入的字符数,包括结尾的空字符。

int snprintf(char *str, size_t size, const char *format, ...);

2.2 格式控制字符串 format

格式化输出函数中的format 参数称为格式控制字符串,顾名思义,首先它是一个字符串的形式,其次它能够控制后续变参的格式转换。格式控制字符串由两部分组成:普通字符(非%字符) 和转换说明。普通字符会进行原样输出,每个转换说明都会对应后续的一个参数,通常有几个转换说明就需要提供几个参数, 使之一一对应。如下所示:

printf("转换说明 1 转换说明 2 转换说明 3", arg1, arg2, arg3);

格式控制字符串(format )定义了输出数据的格式,包括数据类型、宽度、精度、填充字符等。格式控制字符串通常包括以下几个部分:

转换说明符(Conversion Specifier):指定要输出的数据类型,例如:

  • %d 表示十进制整数。
  • %f 表示浮点数。
  • %s 表示字符串。
  • %c 表示字符。
  • %x 或 %X 表示十六进制整数(小写或大写)。

标志(Flags):可以改变输出格式的选项,例如:

  • %- 表示左对齐。
  • %+ 表示总是显示正负号。
  • %0 表示使用零填充到指定宽度。
  • %# 表示显示八进制数的前缀 0 或十六进制数的前缀 0x 或 0X

宽度(Width):指定输出的最小字符数,如果数据不足,会用空格或指定的填充字符填充。

精度(Precision):对于浮点数,指定小数点后的位数;对于字符串,指定最大字符数。

长度修饰符(Length Modifier):指定数据的长度,例如:

  • %l 表示长整型(long int)。
  • %h 表示短整型(short int)。
  • %ll 表示长长整型(long long int)。

填充字符:如果指定了宽度,可以使用填充字符来填充输出,例如 %10s 会输出一个字符串,并且在其前后填充空格直到宽度达到10个字符。

每个转换说明都是以%字符开头,只有%和 type 字段是必须的,其余都是可选的。其格式如下所示(使用[ ]括起来的部分是可选的) :

%[flags][width][.precision][length]type

例如下面的示例输出:

printf("%d\n", 123);
//输出:123
//注释:以十进制形式输出整数123,后面跟着一个换行符。printf("%o\n", 123);
//输出:173
//注释:将整数123转换为八进制形式并输出,后面跟着一个换行符。在八进制中,123等于173。printf("%06d", 1000);
//输出:001000
//注释:以零填充到至少6位的宽度输出整数1000。由于1000不足6位,前面用0填充。printf("%.8f\n", 520.1314);
//输出:520.13140000
//注释:以浮点数形式输出520.1314,精度指定为8位小数,因此输出时会显示8位小数,即使最后几位是0。printf("%lld\n", 12345);
//输出:12345
//注释:将整数12345以long long int类型输出,lld是长度修饰符,表示长长整型(64位)。即使没有这个修饰符,大多数现代编译器也会将整型默认为int类型,但使用lld可以确保在所有编译器中都以长整型处理。

2.3 示例程序

下面的程序展示了 printf()fprintf()dprintf()sprintf()snprintf() 函数的使用。每个函数都用来输出格式化的字符串,但它们输出到的地方不同。

#include <stdio.h>int main() {int number = 10;char str[] = "Hello, World!";float pi = 3.14159;// 使用 printf() 输出到标准输出printf("Standard output: %s\n", str);// 使用 fprintf() 输出到文件FILE *file = fopen("output.txt", "w");if (file != NULL) {fprintf(file, "File output: %s\n", str);fclose(file);}// 使用 dprintf() 输出到文件描述符dprintf(fileno(stdout), "Standard output descriptor: %d\n", number);// 使用 sprintf() 将格式化字符串存储到字符数组char buffer[100];sprintf(buffer, "Buffer output: %.2f\n", pi);printf("%s", buffer);// 使用 snprintf() 将格式化字符串存储到字符数组,限制长度snprintf(buffer, sizeof(buffer), "Buffer output with limit: %.2f\n", pi);printf("%s", buffer);return 0;
}
  • printf() 直接将格式化的字符串输出到标准输出(通常是控制台)。
  • fprintf() 需要一个文件指针作为第一个参数,然后将格式化的字符串写入到该文件。
  • dprintf() 类似于 fprintf(),但它使用文件描述符而不是文件指针。
  • sprintf() 将格式化的字符串存储到提供的字符数组中。需要确保数组足够大以避免溢出。
  • snprintf() 与 sprintf() 类似,但提供了一个额外的长度参数来限制写入的字符数,这有助于防止溢出。

程序运行的结果如下:

3 格式化输入

3.1 格式化输入简介

C 库函数提供了 3 个格式化输入函数,包括: scanf()、 fscanf()、 sscanf(),下面是每个函数的简要介绍:

scanf():从标准输入(通常是键盘输入)读取格式化输入。

int scanf(const char *format, ...);

fscanf():从指定的文件中读取格式化输入,文件通过 FILE 指针指定,它有两个固定参数, FILE 指针和格式控制字符串 format。

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

 sscanf():从字符串中读取格式化输入。

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

3.2 格式控制字符串 format

与格式化输出函数中的 format 参数格式、写法上比较相似,但也有一些区别。 format 字符串包含一个或多个转换说明,每一个转换说明都是以百分号"%"或者"%n$"开头(n 是一个十进制数字),关于"%n$"这种开头的转换说明使用的不多。

转换格式与输入类似,以%百分号开头的转换说明一般格式如下:

%[*][width][length]type
%[m][width][length]type

%*不会对转换后的结果进行存储:后面可选择性添加星号*或字母 m,如果添加了星号*,格式化输入函数会按照转换说明的指示读取输入,但是丢弃输入,意味着不需要对转换后的结果进行存储,所以也就不需要提供相应的指针参数。
%m会对转换后的结果进行存储:如果添加了 m,它只能与%s、 %c 以及%[一起使用,调用者无需分配相应的缓冲区来保存格式转换后的数据,原因在于添加了 m,这些格式化输入函数内部会自动分配足够大小的缓冲区,并将缓冲区的地址值通过与该格式转换相对应的指针参数返回出来,该指针参数应该是指向 char *变量的指针。随后,当不再需要此缓冲区时,调用者应调用 free()函数来释放此缓冲区。

3.3 示例程序

下面的程序演示了标准输入输出函数 scanf()fprintf()fscanf()sscanf() 的基本用法。

#include <stdio.h>int main() {int i;float f;char s[50];FILE *file;// 使用 scanf() 从标准输入读取整数和浮点数printf("Enter an integer and a float: ");scanf("%d %f", &i, &f);printf("You entered: %d, %.2f\n", i, f);// 写入数据到 input.txt 文件file = fopen("input.txt", "w");if (file == NULL) {printf("Failed to open file for writing.\n");} else {fprintf(file, "fscanf test!\n");fclose(file);}// 读取 input.txt 文件中的数据file = fopen("input.txt", "r");if (file == NULL) {printf("Failed to open file for reading.\n");} else {fscanf(file, "%8s ", s);printf("Read from file: %s\n", s);fclose(file);}// 使用 sscanf() 从字符串读取数据sscanf("123 456.78 Hello", "%d %f %s", &i, &f, s);printf("Parsed: %d, %.2f, %s\n", i, f, s);return 0;
}

代码首先通过 scanf() 从用户那里获取一个整数和一个浮点数,并打印出来。然后写入文本到 input.txt 文件,并通过fscanf()读取这个文件的前8个字符,打印读取的内容。最后通过 sscanf() 从固定字符串中解析数据,并将结果输出。程序运行结果如下:

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

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

相关文章

HTML5常用标签表单from

form表单标签 <!-- form表单其实就是一种&#xff1a;客户端和服务端数据交流一种方式机制。1&#xff1a; 服务端&#xff0c;提供数据接受地址&#xff08;gin/beego/inris&#xff09;比如&#xff1a;http://localhost:8080/toLogin2: 因为浏览器&#xff0c;在提交数据…

基于LangChain+LLM构建增强QA

前言 本文基于LangChain构建了针对自有领域数据的增强QA&#xff0c;支持以下数据源&#xff1a; 针对领域内需要精确回答的问题&#xff0c;从自有DB中查询&#xff1b;针对领域内其他自然语言QA&#xff0c;从自有知识的embedded向量数据库查询&#xff1b;针对领域内其他较…

硬件I2C读写MPU6050

硬件I2C读写MPU6050 SCL接PB10&#xff0c;SDA接PB11,但是硬件I2C引脚不可以任意指定。 查询引脚定义表&#xff0c;来规划引脚。但由于PB6,7,8,9被OLEDz占用&#xff0c;不方便接线了。 可以使用I2C2引脚&#xff0c;但必须是SCL对应PB10&#xff0c;SDA对应PB11&#xff0c;…

python类与面向对象编程

⚠️⚠️⚠️本章后半部分难度激增&#xff0c;请一定认真学习⚠️⚠️⚠️ ⚠️⚠️⚠️本章后半部分难度激增&#xff0c;请一定认真学习⚠️⚠️⚠️ ⚠️⚠️⚠️本章后半部分难度激增&#xff0c;请一定认真学习⚠️⚠️⚠️ 上篇回顾&#xff1a; 上篇我们帮天下第一…

冯喜运:6.7今日外汇黄金原油走势分析及日内操作策略

【黄金消息面分析】&#xff1a;美国初请失业金人数超预期&#xff0c;市场对美联储9月降息预期升温&#xff0c;全球降息潮起&#xff0c;黄金市场受支撑。北京时间本周四&#xff0c;美国劳工部公布的数据显示&#xff0c;截至6月1日当周初请失业金人数增加至22.9万人&#x…

docker bash: vi: command not found 修改文件无法使用 vi yum的方法

如题&#xff0c;被入坑很多次。也参考了很多的修复docker 中的vi yum等方法。最终都未解决。 因为要修改 已安装容器中的各类配置信息。无法使用vi yum很麻烦。除去使用docker 挂载文件方法外&#xff0c;还可以使用如下方法直接修改对应的配置文件信息。 如: 修改 logstas…

短剧系统投流版开发,为运营公司投流业务赋能

短剧系统投流版开发是一项复杂的任务&#xff0c;旨在为运营公司的投流业务提供强大的技术支持和赋能。以下是一些关键步骤和考虑因素&#xff0c;以确保短剧系统投流版的成功开发&#xff1a; 一、明确业务需求与目标 首先&#xff0c;需要深入了解运营公司的业务需求、目标…

Java基础语法---集合---ArrayList

ArrayList是什么 ArrayList可以看作是一个动态数组&#xff0c;提供了自动扩容的能力&#xff0c;意味着它能够根据需要自动调整其大小以容纳更多的元素&#xff0c;而无需预先指定数组的容量。 使用ArrayList需要加入包 import java.util.ArryList ArrayList与普通数组的不同…

Si3N4/SiC纳米复相陶瓷综合性能明显提升 下游可应用范围广泛

Si3N4/SiC纳米复相陶瓷综合性能明显提升 下游可应用范围广泛 Si3N4/SiC纳米复相陶瓷&#xff0c;是以碳化硅&#xff08;SiC&#xff09;纳米颗粒为第二相&#xff0c;弥散进入氮化硅&#xff08;Si3N4&#xff09;基体相制备得到的新型陶瓷材料&#xff0c;对碳化硅陶瓷具有强…

Cannot add ‘xxxxxx‘to Logic Analyzer

问题描述&#xff1a;Keil 中&#xff0c;直接切换到仿真中并添加变量到逻辑分析仪&#xff0c;会报如题类型错误。 解决方法&#xff1a; 需要在先在执行main函数&#xff0c;生成变量内容&#xff0c;然后在添加到逻辑分析仪。具体方法是&#xff0c;在mian 中打断点——运…

小程序简单版录音机

先来看看效果 结构 先来看看页面结构 <!-- wxml --><view class"wx-container"><view id"title">录音机</view><view id"time">{{hours}}:{{minute}}:{{second}}</view><view class"btngroup"…

169.二叉树:完全二叉树的节点个数(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr, right(nullptr) {}* Tree…

“墨者杯”网络安全大赛wp

漏洞利用01 504错误修改为POST提交拿到php源码&#xff0c; 查看逻辑$_POST[roam1] ! $_POST[roam2] && sha1($_POST[roam1]) sha1($_POST[roam2]) 采用数组绕过 roam1[]1&roam2[]2 拿到phpinfo&#xff0c;观察发现 这里的意思是每个php页面都包含这个f14…

微服务网关Gateway(上)

大家好呀&#xff0c;我是苍何。 这年头&#xff0c;大家都在开始卷简历了&#xff0c;我也看了很多同学的简历&#xff0c;其中有一个同学的简历&#xff0c;我印象最为深刻&#xff0c;他的项目经历中&#xff0c;写了自定义 Gateway 过滤器实现统计接口调用耗时&#xff0c…

力扣141. 环形链表

Problem: 141. 环形链表 文章目录 题目描述思路复杂度Code 题目描述 思路 定义快慢指针fast、slow&#xff0c;当fast ! null && fast.next ! null时fast每次走两步、slow走一步&#xff0c;当fast和slow相遇时&#xff0c;则说明存在环 复杂度 时间复杂度: O ( n ) O…

无锡哲讯携手SAP,赋能装备制造业数字化转型

在当今快速发展的工业4.0时代&#xff0c;装备制造业作为国民经济的重要支柱&#xff0c;正面临着前所未有的机遇与挑战。无锡哲讯智能科技有限公司凭借其深厚的行业经验和专业的SAP实施能力&#xff0c;为装备制造业提供全面的数字化解决方案&#xff0c;助力企业实现智能化、…

知识图谱的应用---智慧政务

文章目录 智慧政务典型应用 智慧政务 智慧政务即通过“互联网政务服务”构建智慧型政府&#xff0c;利用云计算、移动物联网、人工智能、数据挖掘、知识管理等技术&#xff0c;提高政府在办公、监管、服务、决策中的智能水平&#xff0c;形成高效、敏捷、公开、便民的新型政府&…

TPM仿真环境搭建

文章目录 背景及注意事项一、CMake二、m4三、GNU MP Library四、TPM_Emulator五、TSS协议栈&#xff08;trousers-0.3.14.tar.gz&#xff09;六、 tpm-tools七、查看是否安装成功八、测试 TPM环境&#xff08;需要开三个终端分别运行&#xff09;8.1 启动TPM &#xff08;第一个…

有关大学的搜题软件?六个不限次的公众号和软件分享啦 #其他#职场发展

有些同学虽然喜欢刷题&#xff0c;但是如果参考答案遗失、找不到参考答案&#xff0c;导致做好的题目无法校对&#xff0c;就会比较烦恼了。不过不用担心&#xff0c;今天就给大家分享一些超好用的搜题工具 1.彩虹搜题 这是个老公众号了 它不仅可以查到大学题目&#xff0c;…

工厂为什么需要各种看板

人眼天生对图像识别速度更快更准确&#xff0c;例如图形&#xff0c;颜色等。人们往往更易于通过视觉信息来获取和理解信息&#xff0c;可视化的看板在工厂管理中也是司空见惯。 那么工厂看板如何帮助企业实现降本、提质、增效&#xff1f; 1、生产计划和生产进度的管理&#…