您的位置:知蚁博客 » C/C++ » C语言中fscanf()函数读空格的问题解决办法

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

作者: 发布时间:2011-06-26 分类:C/C++ 标签: 5,967人浏览

  fscanf()函数是C语言中的文件格式化读取函数,其使用空格、Tab、回车来分割不同单词,使用起来比较方便。在C语言中的文件格式化读写函数:fprintf和fscanf中我们介绍了fscanf函数,并给出了示例程序,本文也将在该程序的基础上进行解说。

  在示例程序中,我们定义了一个结构体类型student,用于保存学生的信息(学号、姓名和三门课的成绩),写入到文件中就是下面这个样子:

1 letuknowit 89.000000 87.000000 88.000000

  每一部分都由空白隔开,因此我们用fscanf()函数就可以分别读入到student结构体的各个成员中了,按理说这个就不会有问题了,但是总会有意外发生,如果学生的名字中出现了空格就不好办了,例如变成下面的样子:

1 letuknowit blog 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

相关文章

6访客评论 ,博主回复4

  1. 学习中

    最新网游06-27 09:01 回复
  2. 不会技术的兄弟来看你了

    混小子06-27 09:24 回复
    • 随便看看就行,微博客上也可以去转转的嘛

      知蚁06-27 21:51 回复
  3. C语言太底层了。我的从你博文最简单的开始看。

    • 以后写点关于wordpress的,估计就能看懂了

      知蚁06-27 21:50 回复
  4. 看来还是不懂!对于这些我就是文盲!

    家具团购06-27 14:54 回复
    • 微博客上看看嘛,保证能看懂

      知蚁06-27 21:50 回复
  5. 我回来了。

    只不过 还是看不懂你写的。

    • 你终于回来了,现在你的链接没事了吧

      知蚁06-27 21:49 回复
  6. 代码这款 还是要从基础学 不太懂

    最新网游06-28 09:22 回复

我来说说

(必须)

(必须,保密)

你确定你已经看过文章了?
取消

无觅相关文章插件,快速提升流量