Fscanf没有正确地从文件中读取浮点数到链表

时间:2017-03-13 17:20:58

标签: c floating-point scanf

所以基本上,使用C,我试图将文件中的信息读入链接列表,当只有价格是浮点数并且大小是字符串时,我才能使用它,但我需要读取大小作为浮动。 我正在读这样的文件

fscanf(file,"%[^-]-%f[^:]:%f\n", pLog->name, &pLog->size, &pLog->price);

并且文件的结构是这样的

bottle-0.33:0.10
bottle-0.50:0.20
bottle-1.50:0.40

现在我尝试用

检查结果
printf("%s %.2f %.2f\n", pLog->name, pLog->size, pLog->price);

它打印这样的一切

bottle 0.33 8290796282473829.00
:0.10 
bottle 0.50 2572489705689592000000000000000000000000000000000000000.00
:0.20
bottle 1.50 0.00
:0.40

任何人都知道出了什么问题?

3 个答案:

答案 0 :(得分:3)

代码使用了错误的格式@BLUEPIXY

// bottle-0.33:0.10
fscanf(file,"%[^-]-%f[^:]:%f\n", pLog->name, &pLog->size, &pLog->price);

"%[^-]"匹配"bottle"并将文字保存在pLog->name "-"匹配"-"并继续扫描 "%f""0.33"匹配,并在pLog->size中保存值0.33 "["":"不匹配,因此扫描停止,函数返回2.
剩余格式"^:]:%f\n"无关紧要。

使用正确的格式,宽度限制和检查结果。

// assume sizeof pLog->name is 10
if (fscanf(file,"%9[^-]-%f:%f\n", pLog->name, &pLog->size, &pLog->price) == 3) 
  Success();
}

答案 1 :(得分:1)

您也可以通过将指针传递给printf()来表示错误。

  printf("%s %.2f %.2f\n", pLog->name, &pLog->size, &pLog->price);

应该是

 printf("%s %.2f %.2f\n", pLog->name, pLog->size, pLog->price);
                                     ^^^         ^^^ 

FWIW,为格式说明符提供不匹配的参数会调用undefined behavior

另外,要匹配"bottle-0.33:0.10"之类的输入,像"%[^-]-%f:%f"这样的格式说明符也足够了。

也就是说,它始终需要检查scanf()和家庭电话的返回值,以便验证成功。否则,您可能最终会使用一些未初始化的值,这可能会再次导致UB。

答案 2 :(得分:1)

您忘记检查fscanf的返回值。否则将会发生的事情非常明显。

  

始终检查您呼叫的功能的返回值。