C语言 认识转换符 fscanf()用法

1 原型

int    fscanf(FILE *stream,  const  char* format, …)

功能:    从stream流中连续读取能够匹配format格式的字符到参数列表中对应的变量里。

参数:    “stream”是FILE指针类型变量,它指向一个真实的流对象。

“format”是C字符串,由“空格”、“非空格”及“转换符”组成。具体格式为%[*][width][modifiers]type。见2.1与format参数相关的概念

“…”是与“format”中“转换符”对应变量地址的列表,两地址间用逗号隔开。

返回值:成功时返回从流中读取成功的数据的个数。失败时返回-1(Debian Linux)。

头文件:<stdio.h>


2 使用fscanf()

2.1与format参数相关的概念

fscanf()的format参数允许的格式为:“%[*][width][modifiers]type”。[]中的内容根据需要供选,可缺省,%type必须要有,不可省。


%:是format参数的起始符号,不可缺少。


%[modifiers]type:表一种类型转换符,如%hd表示short int类型转换符。它是format的核心。转换符的作用是将“数据”转换为转换符代表的数据类型,这里提到的数据必须能够转换为转换符代表的数据类型,fscanf读取数据时也只匹配这样的数据。如pF指向一文件,其中只包含数据[123 [空格] 456],用“fscanf(pF, “%d”, &m);”语句是将123这个数据转换为转换符”%d”所代表的数据类型即整型后保存到&m地址中去。


%*[modifiers]type: 表示跳过stream流中能够被转换为[modifiers]type所代表数据类型的数据不读,如在以上的文件中,用“fscanf(pF, “%*d%d”, &m);”就可以跳过对123的读取,而将456转换为整型后保存到&m地址中。%*m[modifiers]type表跳过stream流中能够被转换为[modifiers]type所代表数据类型的m个“字符”不读。如“fscanf(pF,“%*1d%d”, &m);”是将23转换为整型后保存到&m地址中去。


%width[modifiers]type:表示从stream流中读取width长度的“字符”来转换为[modifiers]type对应数据类型的数据。如“fscanf(pF, “%1d”, &m);”是将1转换为整型后保存到&m地址中去。

2.2 fscanf()例子

fscanf()可以用于读取文件流中的数据。现设有一个文件内容如下,


Figure1:ffReadFile.dat文件

拥有3个数字行的最后一个数字决定拥有两个数字的行数。用fscanf()函数读取其内的内容以笔记到fscanf()函数的用法。


2.2.1 fscanf()对空格的处理

用fopen成功打开ffReadFile.dat文件后,单用以下语句读取文件的第一行内容:

  1. re  = fscanf(pF, "%d%d%d", &oLine.p, &oLine.l, &oLine.x);  
  2. if( 3 == re){  
  3.         //Print on stdout  
  4.         printf("%d\t%d\t%d\n", oLine.p, oLine.l, oLine.x);  
  5. }  

此时,可以正确的打印第一行内容到屏幕之上。fscanf()函数读取第一行三个数据的过程如下:



Figure2:fscanf()函数读取数据过程

文件指针最开始指向ffReadFile.dat的第一个字符(即1)处,然后fscanf()根据“format”中的第一个“转换符”读取文件中的内容直到不符合当前“转换符”能够转换的字符为止,如果不符合“转换符”的数据为空格或者tab则舍掉空格或者tab使文件指针指向下一个数据。然后fscanf()继续在文件中匹配下一个“转换符”的数据。直到为所有的“转换符”匹配完数据为止。


2.2.2 fscanf()对不符合“特定格式”数据的处理

当不符合“特定格式”所要求的数据且不为空格和tab时,fscanf()将匹配到符合“特定格式”的数据赋给地址后不再往下读。如现将ffReadFile.dat中的内容修改如下:


Figure3:ffReadFile.dat修改

再用以下代码读取第一行数据,

  1. re  = fscanf(pF, "%d%d%d", &oLine.p, &oLine.l, &oLine.x);  
  2. if( 3 == re){  
  3.         //Print on stdout  
  4.         printf("%d\t%d\t%d\n", oLine.p, oLine.l, oLine.x);  
  5. }else{  
  6.     switch(re){  
  7.         case 1:  
  8.             printf("oLine.p: %d\n", oLine.p);  
  9.             break;  
  10.         case 2:  
  11.             printf("oLine.p: %d, oLine.l: %d\n", oLine.p, oLine.l);  
  12.             break;  
  13.         default:  
  14.             printf("fscanf() read TypeLine error,re: %d\n", re);  
  15.             break;  
  16. }  
re的值将是1,从而输出读取成功的oLine.p的值。对于此时的情况,只为&oLine.p成功获取了数据,另外两个地址的数据都获取失败。


2.2.3 fscanf()“跳读符:*”

使用‘*’可以跳过文件中的部分内容,比如还是图2中的内容,利用以下的语句替换上个程序的fscanf()语句来读取第一行数据:

  1. re  = fscanf(pF, "%d%*3c%d%d", &oLine.p, &oLine.l, &oLine.x);  

那么程序的输出结果为:100       3       2

%*3c表示跳过3个字符内容。结合2.1程序就得到了如期的输出结果。


2.2.4 fscanf()与输入模式相同的读取

如果ffReadFile.dat文件中的内容如下,


Figure4:ffReadFile.dat

那么如果要读取文件中的第一行内容,书写以下语句即可:

  1. fscanf(pF, "%d,%d,%d", &oLine.p, &oLine.l, &oLine.x);  
以上提到的逗号甚至可以换成’a’这样的字符,但不可以为字符串(Debian Linux 下验证)。


2.2.5 fscanf()读取指定长度的数据

针对上图的文件,可以使用以下语句

  1. fscanf(pF, "%3d,%d,%d", &oLine.p, &oLine.l, &oLine.x);  
为&oLine.p读取只有3位长的数据,但因为此时文件指针指向10000中最后的那个0使文件中内容与fscanf()“format”不再匹配,后两个地址不能够正确的获取数据。


2.2.6 fscanf()的“format”中的[modifiers]type

以上各个小例子已经笔记了fscanf的一些特性,它读数据成功与否是看文件中的数据是否与format的转换符相匹配。type就是C语言中的c(字符转换符), d(整型转换符符), e、E、f、g、 G(浮点型转换符), o(八进制类型转换符), s(字符串类型转换符), u(无符号整型转换符), x、X(16进制数转换符)转换符。个人对转换符的理解是这样的:将内存中的二进制转换为某种类型,如%d是将存储到内存中的一段二进制转换为整型数据。


modifiers是用来为某些数据提供进一步类型转换用的,比如%d表示将匹配到的数据转换为整型。但在C语言的数据类型中还分整型和短整(short int),如果想要将读取到的数据转换为短整型就需要使用modifiers(‘h’)来进一步表示将匹配到的数据转换为短整型。同理,对于其它可以有进一步分类的数据类型也一样,modifiers提供相应的符号来供数据的进一步转换。Modifiers符号有:

  • h,加在d, i, n整数类型转换符前面,整体表示short  int类型转换符。加在o, u,x整型转换符前,整体表示unsigned short  int类型转换符。
  • l,加在d, I, n整数类型转换符前,整体表示long int类型转换符。加在o, u, x整型类型转换符前,整体表示unsigned  long int类型转换符。加在e, f,g浮点数转换符前,整体表示double类型转换符。
  • L,加在e, f, g浮点数类型转换符前,整体表示long double类型转换符。

3 使用fscanf()注意的地方

确保检查返回值,以确定找到了期待的值。而使用%s 格式的时候,一定要小心缓冲区溢出。


CNote Over.
转自http://blog.csdn.net/misskissc/article/details/25137335
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
C语言中,fscanf函数用于从输入流中读取格式化数据。它的基本语法是: int fscanf(FILE *stream, const char *format, ...); 其中,stream是指向输入流的指针,format是格式字串,...表示可变参数列表,用于接收读取的数据。 fscanf函数根据format字串的格式指定,从输入流中读取数据,并将其存储到对应的变量中。例如,"%d"表示读取一个整数,"%f"表示读取一个浮点数,"%s"表示读取一个字串。 下面是一个示例程序,演示了fscanf用法: ```c #include <stdio.h> int main() { FILE *fp = fopen("input.txt", "r"); int a; float b; char arr\[10\]; fscanf(fp, "%d %f %s", &a, &b, arr); printf("a=%d, b=%f, arr=%s\n", a, b, arr); fclose(fp); return 0; } ``` 在这个示例中,我们打开了一个名为"input.txt"的文件,并从中读取一个整数、一个浮点数和一个字串,然后将它们打印到屏幕上。 请注意,fscanf函数会根据格式字串中的格式指定来确定读取的数据类型,并将其转换为对应的变量类型。同时,我们需要使用取地址"&"来传递变量的地址,以便fscanf函数可以将读取的数据存储到正确的位置。 希望这个例子能够帮助你理解fscanf函数的用法。如果还有其他问题,请随时提问。 #### 引用[.reference_title] - *1* *2* [C语言fscanf和fprintf函数的使用](https://blog.csdn.net/cuoguodeshiyihan/article/details/126398888)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C语言基础-fscanf函数使用示例](https://blog.csdn.net/baidu_35692628/article/details/73469842)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值