【问题标题】:fscanf() reading in data not what expectedfscanf() 读取的数据不是预期的
【发布时间】:2014-03-05 06:27:29
【问题描述】:

我得到了我的 fscanf() 代码,它正在从文件中读取数据,但不是我所期望的。应该是:

A 1 3
B 2 5

在终端中以此类推

我的数据文件上有这些

A 4 7 
B 8 6 
C 4 6 
D 7 3 
E 10 2 
F 3 8 
G 1 10 

在终端上阅读时,我得到了这个......

A 4 7 

 4 7 
  8 6 

 8 6 
  4 6 

 4 6 
  7 3 

 7 3 
  10 2 

 10 2 
  3 8 

 3 8 
  1 10 

 1 10 

我希望终端上读取的数据与我的文本文件中的格式完全相同。下面的代码是我自己的

fp = fopen("data.txt", "r");
  if (fp == NULL)
  {
    printf("File, data.txt wasn't read succesfully. \n");
    fclose (fp);
  }
  else
  {
    printf("Reading data from data.txt \n");
    //read in data
    while (1)
    {
      dataTest = fscanf(fp, "%c %d %d", &c, &t1, &t2);
      fscanf(fp,"%c", &nl);
      if (dataTest == -1) break;
      printf("%c %d %d \n", c, t1, t2);
    }

    printf("Data read succesfully ! \n");
    fclose (fp);
  }

【问题讨论】:

  • 你想在这里阅读换行符fscanf(fp,"%c", &nl);吗?也许您的文本文件中没有换行符。另外,if (dataTest == -1) break; 应该紧跟在dataTest = fscanf(fp, "%c %d %d", &c, &t1, &t2); 之后。
  • 是的,那是在回车中读取。不会有新的线路吗?名单正在下降。我将移动 if 语句并更新结果
  • 我同意,首先,如果它的 Windows 机器它甚至可能是一个回车 (\r),如果确实有一个 \n 或 \r 字符,你可以尝试使用类似的东西正确读取最后一个值这: dataTest = fscanf(fp, "%c %d %d\n", &c, &t1, &t2), dataTest = fscanf(fp, "%c %d %d\r", &c, &t1, &t2)
  • fprintf 不读取数据,而是写入数据——并且您的代码中没有 fprintf 调用(尽管您有多个 printf 调用)。您能否更新您的问题以使其更加一致?
  • 循环中的打印语句用于调试目的。我用它来确保终端成功读取数据。

标签: c scanf


【解决方案1】:

改变这个:

  dataTest = fscanf(fp, "%c %d %d", &c, &t1, &t2);
  fscanf(fp,"%c", &nl);

到这里:

  dataTest = fscanf(fp, "%c %d %d\n", &c, &t1, &t2);

或者(取决于你的文件格式)这个:

  dataTest = fscanf(fp, "%c %d %d\r\n", &c, &t1, &t2);

【讨论】:

  • 如果用户将键入信息,请不要进行更改。最后的换行符是空格,fscanf() 将在用户键入除空格以外的其他内容之前完成——这要求他们在当前输入完成之前预测下一个输入需要什么。在这个数据来自文件的示例中是可以的,但最好先进行空白扫描:" %c %d %d"
  • 我只是将上面的数据复制到一个文件中并尝试了它。似乎工作正常。 OP 可能需要使用\r\n 而不是\n,具体取决于文件格式,但每行末尾的空格字符似乎不会影响fscanf
  • 就像我说的,在这种情况下,尾随换行符是可以的。当数据来自文件时,\r\n 可能也适用于 Unix 或 Windows。问题在于来自终端的输入。然后尾随空格会占用您键入的所有空格,直到您键入不是空格的内容——换行符是空格。
  • 这正是我所说的,我很抱歉,但当这种情况发生时我确实讨厌它#justsaying
猜你喜欢
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 2018-06-01
  • 2015-05-12
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多