C 风格文件输入/输出---有格式输入/输出--(std::scanf, std::fscanf, std::sscanf)

news2025/1/11 2:41:58
C++ 标准库的 C I/O 子集实现 C 风格流输入/输出操作。 <cstdio> 头文件提供通用文件支持并提供有窄和多字节字符输入/输出能力的函数,而 <cwchar>头文件提供有宽字符输入/输出能力的函数。

有格式输入/输出

从 stdin、文件流或缓冲区读取有格式输入

std::scanf, 
std::fscanf, 
std::sscanf

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

(1)

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

(2)

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

(3)

 从各种源读取数据,按照 format 转译并存储结果于给定位置。

1) 从 stdin 读数据

2) 从文件流 stream 读数据

3) 从空终止字符串 buffer 读数据

参数

stream-读取来源的文件流
buffer-指向读取数据来源的空终止字符串
format-指向指定如何读取输入的空终止字符串的指针。

格式字符串由下列内容组成

  • 非空白多字节字符,除了 % :每个格式字符串中的这种字符处理来自输入流的准确同一字符,或若它与流的下个字符比较不相等则导致函数失败。
  • 空白符:任何格式字符串中的单个空白符处理所有来自输入的可用连续空白符(如同通过于循环中调用 isspace 确定)。注意格式字符串中 "\n" 、 " " 、 "\t\t" 或其他空白无区别。
  • 转换指定:每个转换指定拥有下列格式:
  • 引入用 % 字符
  • (可选)赋值抑制字符 * 。若存在此选项,则此函数不将结果赋值给任何接收用参数。
  • (可选)指定最大域宽的整数数字(大于零),即函数进行在当前转换指定所指定的转换时,允许处理的最大字符数。注意若不提供宽度,则 %s 和 %[ 可能导致缓冲区溢出。
  • (可选)指定接收参数大小的长度修饰符,即实际目标类型。这影响转换准确性和溢出规则。默认目标类型对每个转换类型不同(见下表)。
  • 转换格式指定符

下列格式指定符可用:

转换
指定符
解释参数类型
长度修饰符hh

(C++11)

h(无)lll

(C++11)

j

(C++11)

z

(C++11)

t

(C++11)

L
%匹配字面 %N/AN/AN/AN/AN/AN/AN/AN/AN/A
c

匹配一个字符字符的序列

若使用了宽度指定符,则匹配准确的宽度个字符(该参数必须是指向有充足空间的数组的指针)。不同于 %s 和 %[ ,它不会在数组后附加空字符。

N/AN/A

char*

wchar_t*

N/AN/AN/AN/AN/A
s

匹配非空白字符的序列(一个字符串

若使用宽度指定符,则至多匹配宽度个字符,或匹配到首个提前出现的空白符前。总是在匹配的字符后存储一个空字符(故参数数组必须有至少宽度 +1 个字符的空间)。

[set]

匹配一个来自 set 的字符的非空字符序列。

若集合的首字符是 ^ ,则匹配所有不在集合中的字符。若集合以 ]^] 开始,则 ] 字符亦被包含入集合。在扫描集合的非最初位置的字符 - 是否可以指示范围,如 [0-9] ,是实现定义的。若使用宽度指定符,则最多匹配到宽度。总是在匹配的字符后存储一个空字符(故参数数组必须有至少宽度 +1 个字符的空间)。

d

匹配一个十进制整数

该数的格式同 strtol() 以值 10 为 base 时所期望者

signed char* 或 unsigned char*

signed short* 或 unsigned short*

signed int* 或 unsigned int*

signed long* 或 unsigned long*

signed long long* 或 unsigned long long*

intmax_t* 或 uintmax_t*

size_t*

ptrdiff_t*

N/A
i

匹配一个整数

该数的格式同 strtol() 以值 ​0​ 为 base 时所期望者(基底以首个分析的字符确定)

u

匹配一个无符号十进制整数

该数的格式同 strtoul() 以值 10 为 base 参数时所期望者。

o

匹配一个无符号八进制数

该数的格式同 strtoul() 以值 8 为 base 参数时所期望者。

x, X

匹配一个无符号十六进制整数

该数的格式同 strtoul() 以值 16 为 base 参数时所期望者。

n

返回迄今读取的字符数

不消耗输出。不增加赋值计数。若此指定符拥有赋值抑制运算符,则行为未定义。

a, A(C++11)
e, E
f, F
g, G

匹配一个浮点数

该数的格式同 strtof() 所期望者。

N/AN/A

float*

double*

N/AN/AN/AN/A

long double*

p

匹配定义一个指针的实现定义的字符序列。

printf 系列函数应该用 %p 格式指定符产生同样的序列。

N/AN/A

void**

N/AN/AN/AN/AN/AN/A

对于每个异于 n 的转换指定符,不超过任何指定域宽,且要么是转换指定符所准确期待,要么是其所期待的前缀的最长输入字符序列,即是从流中消耗的内容。此消耗序列后的首个字符若存在,则保持未读取。若被消耗序列长度为零,或被消耗序列不能转换成上面所指定的项目,则发生匹配失败,除非遇到文件尾、编码错误,或阻止从流输入的读取错误,此情况下此为输入失败。

所有异于 [cn 的转换指定符,在尝试分析输入前消耗并舍弃所有前导空白字符(如同以调用 isspace 来确定)。这些被消耗的字符不计入指定的最大域宽。

转换指定符 lclsl[ 进行多字节到宽字符转换,如同如同在转换首字符前,通过用初始化到零的 mbstate_t 对象调用 mbrtowc() 。

转换指定符 s[ 始终在匹配字符之后存储一个空字符。目标数组的大小必须至少比指定域宽大一。

定宽整数类型( int8_t 等)的正确的转换指定定义于头文件 <cinttypes> (虽然 SCNdMAX 、 SCNuMAX 等就是 %jd%ju 等的别名)。

在每个转换指定符后有一个序列点;这允许存储多个域到同一“池”变量中。

在分析以无数字指数为结尾的不完整浮点值,如以转换指定符 %f 分析 "100er" 时,消耗序列 "100e" (可能为合法浮点数的最长前缀),并导致匹配错误(被消耗序列不能转换成浮点数),而留下 "r" 。某些既存实现不遵守此规则并回滚,通过消耗 "100" 而留下 "er" ,例如 glibc 漏洞 1765 。

...-接收的参数

返回值

成功赋值的参数数(在首个参数赋值前发生匹配失败的情况下可为零),或若在赋值首个接收的参数前输入失败则为 EOF 。

注意

因为大多数转换指定符首先消耗所有连续空白符,如下代码

std::scanf("%d", &a);
std::scanf("%d", &b);

会读取输入于不同行(第二个 %d 会消耗第一个剩下的换行符)或同一行中为空格或制表符所分隔的(第二个 %d 会消耗空格或制表符)二个整数。

不消耗前导空白符的转换指定符,如 %c ,可通过在格式化字符串中用空白符使得它这么做:

std::scanf("%d", &a);
std::scanf(" %c", &c); // 忽略 %d 后的换行符,然后读一个 char

调用示例

#include <iostream>
#include <clocale>
#include <cstdio>

int main()
{
    int i, j;
    float x, y;
    char str1[10], str2[4];
    wchar_t warr[2];
    std::setlocale(LC_ALL, "en_US.utf8");

    char input[] = u8"25 54.32E-1 Thompson 56789 0123 56ß水";
    // 按如下分析:
    // %d :整数
    // %f :浮点值
    // %9s :至多 9 个非空白字符的字符串
    // %2d :二位整数(数字 5 与 6 )
    // %f :浮点值(数字 7 、 8 、 9 )
    // %*d 不存储于任何位置的整数
    // ' ' :所有连续空白符
    // %3[0-9] :至多 3 位数字的字符串(数字 5 与 6 )
    // %2lc :二个宽字符,用多字节到宽转换
    int ret = std::sscanf(input, "%d%f%9s%2d%f%*d %3[0-9]%2lc",
                          &i, &x, str1, &j, &y, str2, warr);

    std::cout << "Converted " << ret << " fields:\n"
              << "i = " << i << "\nx = " << x << '\n'
              << "str1 = " << str1 << "\nj = " << j << '\n'
              << "y = " << y << "\nstr2 = " << str2 << '\n'
              << std::hex << "warr[0] = U+" << warr[0]
              << " warr[1] = U+" << warr[1] << '\n';
    return 0;
}

输出

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

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

相关文章

电脑文件删除没有在回收站怎么恢复?可以参考这些方法

“不慎删除了辛苦搜集的资料&#xff0c;可是在回收站里却找不到它们。这可真是让人困扰。恳请大神能否伸出援手&#xff0c;帮我解决这个问题&#xff1f;” ——在使用电脑的过程中&#xff0c;我们常常会不小心删除一些重要的文件&#xff0c;而这些文件并未进入回收站&…

Spring中加密工具类DigestUtils和BCryptPasswordEncoder

spring中的加密工具类DigestUtils Spring中自带了一个加密工具类&#xff0c;所在的位置的是org.springframework.util.DigestUtils&#xff0c;在spring-core模块中。 该工具类中默认只提供了MD5加密相关的静态方法&#xff0c;同时还有一些获取其他加密算法的私有方法&#…

pdf拆分成多个文件的方法以及注意事项

PDF是一种非常流行的文件格式&#xff0c;但有时候我们需要将一个大的PDF文件拆分成多个小的文件&#xff0c;以便于管理和分享。本文将介绍一些拆分PDF文件的方法以及需要注意的事项。 AdobeAcrobat是一款专业的PDF编辑软件&#xff0c;可以轻松地拆分PDF文件。以下是使用Adob…

读取XML的几种方式

一、为什么使用XML 1、便于不同应用程序之间通信。 2、便于不同平台之间通信。 3、便于不同平台之间数据共享。 二、Dom读取 xml文件内容 <?xml version"1.0" encoding"UTF-8"?> <bookstore><book id"1"><name>冰…

Java | 线程的生命周期和安全

不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始&#xff0c;不如现在行动&#xff01; &#x1f334;线程的生命周期 sleep方法会让线程睡眠&#xff0c;睡眠时间到了之后&#xff0c;立马就会执行下面的代码吗&#xff1f; 答&#xff1a;不会&am…

OSM最新电力数据(2023年9月1日数据)转换总结及与三个月前转换结果对比

sm包含种类繁多&#xff0c;我们这里是只以刚转换的电力设备为例抛砖引玉的进行说明。 首先先看一下转换结果大概368个文件&#xff0c;大约92种类型。当然其中有同一类设备的点、线、面类型&#xff01; 这种带增强的文件&#xff0c;是我在基础规则之外增加的提取规则。是为…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 六)

AppStorage&#xff1a;应用全局的UI状态存储 AppStorage是应用全局的UI状态存储&#xff0c;是和应用的进程绑定的&#xff0c;由UI框架在应用程序启动时创建&#xff0c;为应用程序UI状态属性提供中央存储。 和LocalStorage不同的是&#xff0c;LocalStorage是页面级的&…

SG-Former实战:使用SG-Former实现图像分类任务(一)

摘要 SG-Former是一种新型的Transformer模型&#xff0c;它被提出以降低视觉Transformer的计算成本&#xff0c;同时保持其优秀的性能表现。计算成本的降低使得SG-Former能够更有效地处理大规模的特征映射&#xff0c;从而提高了模型的效率和全局感知能力。 SG-Former的核心思…

算法综合篇专题三:二分法

"寻一颗&#xff0c;未萌的渺小啊&#xff0c;随着青翠未来&#xff0c;升入辽阔云霄~" 现在你有一个"升序"数组&#xff0c;想让你在这个数组里完成查找数字n&#xff0c;在这个数组内的下标&#xff0c;你可以怎么做&#xff1f;这也许是不少友子们初遇…

内存卡中毒了格式化能解决吗?这样清除病毒更有效

内存卡被广泛应用于手机、相机、MP3等数码产品&#xff0c;并且可以存储各种媒体文件&#xff0c;如视频、图片等。然而&#xff0c;在我们使用过程中&#xff0c;您是否因内存卡格式化而导致重要数据丢失感到困扰。对于“内存卡中毒了格式化能解决吗&#xff1f;“的疑惑&…

用于非线性多载波卫星信道的多输入多输出符号速率信号数字预失真器DPD(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【LeetCode刷题篇零】一些基础算法知识和前置技能(下)

数组常用技巧 使用数组代替Map 使用另一个数组来统计每个数字出现的次数&#xff0c;数组的下标作为key, 数组的值作为value&#xff0c; 将数字作为数组的下标索引&#xff0c;数组里的值存储该数字出现的次数&#xff0c;原理有点类似桶排序中使用的计数数组。 比如这里如…

tensorboard可视化文件:events.out.tfevents.

跑了一个开源代码&#xff0c;跑完之后看到生成的文件夹里&#xff0c;出现了events.out.thevents.xxx的格式文件&#xff0c;比较好奇&#xff0c;进行了一番学习~   首先说明文件作用&#xff1a;用于tensorboard显示的可视化文件 使用方法 首先要安装tensorboard&#x…

mvn打包:依赖包和启动包分离

简述 依赖插件&#xff1a; maven-jar-plugin maven-assembly-plugin项目目录结构 assembly.xml <assembly xmlns"http://maven.apache.org/ASSEMBLY/2.1.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://…

zookeeper可视化界面zkui

获取zkui github地址&#xff1a;https://github.com/DeemOpen/zkui 可以使用客户端clone&#xff0c;我这里直接下载zip 解压 编译 如果将包下载到了linux&#xff0c;需要在linux中编译&#xff0c;我的linux没有maven&#xff0c;所以在window编译好&#xff0c;然后复制…

Win10显卡驱动安装失败怎么办

在更新Win10系统的过程中&#xff0c;显卡驱动也要跟着更新&#xff0c;近期有小伙伴反映在安装的过程中显示Win10显卡驱动安装失败&#xff0c;这是怎么回事&#xff0c;遇到这种问题应该怎么解决呢&#xff0c;下面小编就给大家详细介绍一下Win10显卡驱动安装失败的解决方法&…

一文说清mmap内存映射底层原理(以LCD中的Framebuffer为例)

一文说清mmap内存映射底层原理 【目录】 一、宏观解释内存映射 二、进程虚拟地址空间 三、虚拟内存区域描述符 四、内存映射的实现 五、mmap在Framebuffer中的应用 前几天的一场面试中&#xff0c;面试官问&#xff1a;为什么可以通过mmap直接操作LCD&#xff1f; 当…

上海亚商投顾:沪指放量反弹 医药、AI概念股集体走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数早间震荡反弹&#xff0c;午后集体拉升涨超1%&#xff0c;深成指一度涨超1.5%&#xff0c;随后涨幅略…

CSP 202104-1 灰度直方图

答题 就是记录每个数出现的次数&#xff0c;用C的map就行 #include<iostream> #include<map> using namespace std; int main(){map<int,int>h;int n,m,L,a;cin>>n>>m>>L;for(int i0;i<L;i){h[i]0;}while(n--){for(int i0;i<m;i){…

django configparser.NoSectionError: No section: ‘Samples

django configparser.NoSectionError: No section: Samples 背景&#xff1a;Windows下的Django项目&#xff0c;重新部署至Linux ubuntu20中。 samples_white_list eval(config.get(‘Samples’, ‘samples_white_list’)) File “/home/hhl/anaconda3/envs/django/lib/pytho…