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

fscanf - I don't know what I'm doing wrong here

 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");
    }
  } 

我正在尝试读取的文件如下所示:

i 10

i 12

d 10

d 12

(character/integer 以制表符分隔)。我的输出是:

id: i, value: 10

bad input

id: i, value: 12

bad input

id: d, value: 10

bad input

id: d, value: 12

bad input

我做错了什么? "Bad input" 只应在文件格式不正确时打印。上面的文件演示了一个格式正确的文件。我不明白如何同时 r == 2r != 2 (这两个条件都以某种方式满足)。

使用

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

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

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

然后它留下一个换行符,在下一次迭代中使用。 作为你的下一次迭代,你的 id 得到 \n 并且 num 得到字符。

但是当你在 %c 之前放置额外的白色 space 时,它告诉 fscanf() 忽略白色 spaces(包括制表符,space 或换行符) . 因此你的 fscanf() 得到两个参数(字符和数字)。

请更改

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

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

在 fscanf 的末尾添加 \n。

在您的文件中,行以 \n 终止。 在接下来的阅读中,它并不顺利。