您的位置:首页 > 编程语言 > C语言/C++

C语言初学之fscanf()函数理解

2016-02-01 16:41 363 查看
本人第一次写博客,所以不足之处希望大家多多指出,万分感谢。

这里主要想通过写博客巩固自己的知识,并且能够检验自己所学的是否正确,还能够不断加入新的知识,并且不断与高手交流,提高自己。

好了多的不说了。

下面主要对自己关于fscanf()函数的体会:

(1)自己有一段数据,

数据如下

19940329,2009040112,90

19940503,2009040117,96

10040508,2009040114,86

等等

第一列表示生日,第二列表示学号,第三列表示分数,中间通过逗号隔开,自己想通过fscanf函数达到如下输出

生日:19940329,学号:2009040112,考试分数:90

代码如下

[code]    #include<stdio.h>
    int main()
    {
      char birthday[20]
      char number[20];
      int score;
      puts("please input the birthday number and score in order ")
      while(fscanf(stdin,"%[^,],[^,],%i",birthday,number,&score)==3)
      {
       fprintf(stdout,"%s,%s,%i\n",birthday,number,score);
      }
      put("thanks for your visiting");
      return 0;

    }
    这个程序是简单将标准输入和标准输出默认为屏幕,只是作为检验程序是否正确输出,应该重定向到文件之中,在次之前,我想谈谈自己写上面代码遇到的问题。
    首先如果初始数据之间不是以逗号隔开的,而是以空格分开,那么在写fscanf()时如下:


fscanf(“%s%s%i”,birthday,number,&score)

[code]后来我查fscanf的函数原型:
int fscanf(FILE*stream,constchar*format,[argument...]);
其中的参数:const char * format 我举几个例子如下:

%s : 读入一个字符串,遇空字符‘\0'结束。
我写了如下代码来检测:

  #include<stdio.h>
  int main()
  {
   char name[4];
   fscanf(stdin,"%s",name);
   fprintf(stout,"%s\n",name);
   return 0;
  }


测试时即使我输入的字符个数多余3个,也会照样输出,我记得c语言里面的字符数组最后面以\0,也就是NULL来作为结束的标志,所以我这里char name[4]最多应该输入三个字符,我觉得程序没有检查这个问题(当然这里我的认识可能错误),所以比较危险。但是我改成

fscanf(stdin,”%2s”,name)之后也没有作用,这里求教

还有源程序中[^,]表示的是遇到逗号就作为结束。

下面用重定向的方式从文件读取,再写入新的文件中去:

源文件数据:

19940904,201204015001,90

19940329,201204015002,95

19950302,201204015003,92

19940613,201204015004,84

19951221,201204015005,83

19940204,201204015006,97

19940403,201204015007,76

19951131,201204015008,88

程序:

[code]#include<stdio.h>
int main()
{
 char birthday[20];
 char number[20];
 int score;
 FILE *infile=fopen("primitive_data.txt","r");
 FILE *outfile=fopen("organized_data.txt","w");

 while(fscanf(infile,"%[^,],%[^,],%i",birthday,number,&score)==3)
  {
   fprintf(outfile,"生日:%s, 学号: %s, 分数: %i\n",birthday,number,score);
  }
return 0;
}


结果:

生日:19940904, 学号: 201204015001, 分数: 90

生日:

19940329, 学号: 201204015002, 分数: 95

生日:

19950302, 学号: 201204015003, 分数: 92

生日:

19940613, 学号: 201204015004, 分数: 84

生日:

19951221, 学号: 201204015005, 分数: 83

生日:

19940204, 学号: 201204015006, 分数: 97

有一个问题,从第二项开始不知道问什么生日后面输出多了个换行,,,

当然,程序还是很不完整,后面我还好继续改,也请大家帮忙看一下,批评指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: