matlab fscanf无法读入空格,C语言中fscanf()函数读空格的问题解决办法

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

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值