【发布时间】:2022-01-07 16:21:07
【问题描述】:
我正在从常规文件中读取数据,我想知道哪个可以提供最大的灵活性。
我发现 fgets 和 getline 都在一行中读取(一个具有最大字符数,另一个具有动态内存分配)。在 fgets 的情况下,如果行的长度大于给定的大小,则不会读取该行的其余部分,但仍会在流中缓冲。使用 getline,我担心它可能会尝试为一条非常长的线分配一大块内存。
对我来说显而易见的解决方案似乎是转向 fgetc,但这带来的问题是函数调用会很多,从而导致读取过程很慢。
在灵活性和效率之间的任何一种情况下,这种妥协是不可避免的,还是可以通过?
【问题讨论】:
-
不用担心
fgetc的函数调用开销。几乎可以肯定,瓶颈将是 IO,而不是函数调用开销。你可以使用getc,这是一个可以避免一些开销的宏......但是你根本不应该担心这个,直到/除非你有基准证明它实际上是一个问题。 -
注意,无论你使用
fgets还是fgetc,read的实际数量都是一样的。这就是缓冲的全部目的。 -
你有一个非常经典的权衡,这三个方面:(1) 能够处理任意长的行对你来说是多么重要,可能比你预先选择的任何固定大小都大? (2) 绝对、最大效率(不一定只是“足够快)”有多重要?(3) 你想做多少工作?根据你对这些问题的回答,你可以选择
fgets,或者getline,或者你自己的涉及getc的输入循环,或者使用mmap的更奇特的东西。(我,我永远不会使用fgetc,尽管由于某种原因它现在似乎很流行。) -
感谢您的回复。能够处理长线并不重要,但绝对是首选。最大效率并不那么重要,所以我很可能会使用 getc 作为宏。
标签: c file-io fgets getline fgetc