fscanf()函数是C语言中的文件格式化读取函数,其使用空格、Tab、回车来分割不同单词,使用起来比较方便。在C语言中的文件格式化读写函数:fprintf和fscanf中我们介绍了fscanf函数,并给出了示例程序,本文也将在该程序的基础上进行解说。
在示例程序中,我们定义了一个结构体类型student,用于保存学生的信息(学号、姓名和三门课的成绩),写入到文件中就是下面这个样子:
1 letuknowit 89.000000 87.000000 88.000000
每一部分都由空白隔开,因此我们用fscanf()函数就可以分别读入到student结构体的各个成员中了,按理说这个就不会有问题了,但是总会有意外发生,如果学生的名字中出现了空格就不好办了,例如变成下面的样子:
1 letuknowitblog 89.000000 87.000000 88.000000
这个时候再按照我们以前的读取方式就会出现问题了,你会发现读取到的学生成绩全部都出错了,出错的原因就是letuknowit和blog之间的那个空格。那这个问题到底该怎么解决呢?请看下面的代码:
C语言: 知蚁博客
#include “stdio.h”
struct student
{
char chName[20]; //姓名
int nID; //学号
float fScores[3]; //3门课的成绩
};
void main()
{
FILE *pRead;
struct student tStu;
pRead=fopen(“stu_scores.txt”,“r”);
if(NULL == pRead)
{
return;
}
//从文件中读取数据(主要下面参数中的&)
fscanf(pRead,“%d %[^0-9] %f %f %f\n“,&tStu.nID,tStu.chName,&tStu.fScores[0],&tStu.fScores[1],&tStu.fScores[2]);
fclose(pRead);
//打印读取的数据到屏幕上
printf(“%d %s %.1f %.1f %.1f\n“,tStu.nID,tStu.chName,tStu.fScores[0],tStu.fScores[1],tStu.fScores[2]);
}
对比前面文章的代码,会发现原先的%s变为了%[^0-9] ,只需要改动这一点点就可以了,下面知蚁就说说为什么要这样修改。那就得说说fscanf函数的格式字符串了。
[] 读取数据但只允许括号内的字符。如[0-9]只允许读入0-9的数字。
[^] 读取数据但不允许中括号中的^符号后的字符出现,如[^0-9]表示不允许读入0-9的数字.
因此我们上面读入学生名的时候就会一直读取(空格照样读取),直到遇到数字后停止,因此就可以正确的读取名字为letuknowit blog了,后面读取成绩也就正确了。
看到这里大家就会发现一个问题了,名字中不可以包含数字,否则还是会出错,这个时候就只能考虑把名字部分放到最后来读取了,调整为如下形式:
1 89.000000 87.000000 88.000000 letuknowit blog
然后修改参数为”%d %[^\n] %f %f %f\n”来读取了。知蚁建议还是不要采用fscanf来读取来空格的字符串,可以用fgets函数来代替。
原创文章请注明转载于知蚁博客,本文地址:http://www.letuknowit.com/archives/100