何时/为什么使用fscanf()函数是个坏主意?

Rob*_*Kam 6 c file-io pointers

一个答案中有一个有趣的声明:" 使用该函数几乎总是一个坏主意,fscanf()因为它可以在失败时将文件指针留在未知位置.我更倾向于使用fgets()每条线路然后进入sscanf()."

你可以扩展何时/为什么它可能更好用fgets()sscanf()阅读一些文件?

Chr*_*uin 13

想象一下有三行的文件:

   1
   2b
   c
Run Code Online (Sandbox Code Playgroud)

使用fscanf()读取整数,第一行读取正常,但在第二行将fscanf()离开你在'b',不知道该怎么做.您需要一些机制来移动垃圾输入以查看第三行.

如果你做一个fgets()sscanf(),你能保证你的文件指针的时间,这是一个比较容易对付移动的线.通常,您仍然应该查看整个字符串以报告其中的任何奇怪字符.

我自己更喜欢后一种方法,虽然我不同意"使用它几乎总是一个坏主意fscanf()"的说法...... fscanf()对于大多数事情来说都是完美的.


小智 5

当您匹配字符文字时,就会出现这种情况。假设您有:

int n = fscanf(fp, "%d,%d", &i1, &i2);
Run Code Online (Sandbox Code Playgroud)

考虑两个可能的输入“ 323,A424”和“ 323A424”。

在这两种情况下fscanf()都会返回 1 并且读取的下一个字符将是'A'。无法确定逗号是否匹配。

话虽这么说,只有当找到错误的实际来源很重要时,这才重要。在知道存在格式错误的输入错误就足够的情况下,fscanf()实际上优于编写自定义解析代码。