代码之家  ›  专栏  ›  技术社区  ›  Rob Kam Bayard Randel

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

  •  6
  • Rob Kam Bayard Randel  · 技术社区  · 16 年前

    在里面 an answer 有一句有趣的话:“几乎是 使用计算机是个坏主意 fscanf() fgets() 让每一行进去然后 sscanf() 那个。”

    fgets() sscanf()

    6 回复  |  直到 8 年前
        1
  •  14
  •   d33tah    11 年前

    想象一个文件有三行:

       1
       2b
       c
    

    fscanf() 要读取整数,第一行可以读取,但第二行可以读取 fscanf() 会把你留在“b”,不知道该怎么办。您需要一些机制来越过垃圾输入查看第三行。

    如果你做了一个 fgets() sscanf() ,您可以保证文件指针一次移动一行,这更容易处理。一般来说,您仍然应该查看整个字符串以报告其中的任何奇数字符。

    我自己更喜欢后者,尽管我不同意“使用它几乎总是一个坏主意”的说法 fscanf() "... fscanf() 对大多数事情来说都很好。

        2
  •  4
  •   d33tah    11 年前

    当您匹配字符文字时,这一点就会起作用。假设你有:

    int n = fscanf(fp, "%d,%d", &i1, &i2);
    

    考虑两种可能的输入 323,A424 323A424 ".

    fscanf() 将返回1,读取的下一个字符将是 'A'

    fscanf() 实际上优于编写自定义解析代码。

        3
  •  2
  •   Sparr    16 年前

        4
  •  2
  •   Emmet    11 年前

    原因有两个:

    • scanf() 可以离开 stdin 处于一种难以预测的状态;如果不是不可能的话,这会使错误恢复变得困难(这对于 fscanf()
    • 整个 family将指针作为参数,但没有长度限制,因此它们可以溢出缓冲区并更改恰好位于缓冲区之后的不相关变量,从而导致看似随机的内存损坏错误,很难理解、查找和调试,特别是对于经验较少的用户 C

    新手 C 程序员经常混淆指针和运算符的地址,并且经常忽略 & scanf() 这是我的错,所以我把它从我的清单上删掉了,但它值得记住。

    23年后,我 C 对于初学者)向还不理解指针和堆栈的新手解释它们是非常困难的。

    scanf() 新手 C

    好吧,也许不是 无情地

        5
  •  1
  •   d33tah    11 年前

    这几乎总是一个坏主意,使用 fscanf() 函数,因为它会在失败时将文件指针保留在未知位置。我更喜欢使用 fgets() sscanf() 那个

    ftell() 找出文件中的当前位置,然后决定从那里做什么。基本上,如果你知道你能期待什么,那就可以随意使用 .

        6
  •  0
  •   cyberconte    16 年前

    基本上,没有办法说出这个函数 超出分配给它的内存区域的界限。

    现在已经出现了许多替代品,比如fnscanf,它试图通过指定读卡器写入的最大限制来修复这些函数,从而使其不会溢出。