fscanf - 我不知道我在这里做错了什么

时间:2015-09-20 13:45:01

标签: c scanf

 char id;
 int num, r;
 if (argc != 2) {
   printf("error\n");
   exit(1);
 }

 FILE *file = fopen(argv[1], "r");
 if (file == NULL) {
   printf("error\n");
   exit(1);
  }

  while ((r = fscanf(file, "%c\t%d", &id, &num)) != EOF) {
    if(r == 2) {
      printf("id: %c, value: %d\n", id, num);
    }
    else if (r!=2) {
      printf("bad input\n");
    }
  } 

我试图阅读的文件如下:

  

我10

     

我12

     

d 10

     

d 12

(字符/整数以制表符分隔)。我的输出是:

  

id:i,价值:10

     

错误输入

     

id:i,价值:12

     

错误输入

     

id:d,值:10

     

错误输入

     

id:d,值:12

     

错误输入

我做错了什么? "糟糕的输入"如果文件格式不正确,只应打印。上面的文件演示了格式正确的文件。我不能同时理解r == 2r != 2的方式(两种条件都以某种方式得到满足)。

2 个答案:

答案 0 :(得分:4)

使用

while((r = fscanf(file, " %c\t%d", &id, &num)) != EOF)  //Whitespace before %c 

可能会解决您的问题。因为当你使用

fscanf(file, "%c\t%d", &id, &num)

然后它留下一个在下一次迭代中消耗的换行符。 在您的下一次迭代中,id获取\nnum即可获得该字符。

但是当你在%c之前加上额外的空格,告诉fscanf()忽略空格(包括Tab,空格或换行符)。 因此,fscanf()获得两个参数(字符和数字)。

答案 1 :(得分:2)

请更改

while ((r = fscanf(file, "%c\t%d", &id, &num)) != EOF) {

 while ((r = fscanf(file, "%c\t%d\n", &id, &num)) != EOF) {

在fscanf中添加\ n。

在您的文件中,行以\ n结束。 在下一次阅读中,它并不顺利。