我有一个文本文件,我应该分配一个数组,其中包含与文件中行数一样多的条目。什么更有效:读取文件两次(首先找出行数)并分配一次数组,或者读取文件一次,并在每行读取后使用“realloc”?提前谢谢你。
答案 0 :(得分:1)
无论效率如何,读取文件两次都是一个坏主意。 (它几乎肯定效率低下。)
如果您的应用程序坚持阅读其输入文件,则表示其输入必须可以重新排列,这不包括终端输入和管道。这是一个非常令人烦恼的限制,以至于真正需要多次读取输入的应用程序(如sort
)通常具有在输入无法搜索时进行临时复制的逻辑。
在这种情况下,您只是试图避免一些额外的malloc调用的微不足道的开销。这不是限制应用程序输入选项的理由。
如果这还不够令人信服,想象如果有人在您第一次阅读文件和第二次阅读文件之间附加文件会发生什么。如果您的实现信任它在第一次读取时获得的计数,它将在第二次读取时超出行指针的向量,从而导致未定义的行为和潜在的安全漏洞。
答案 1 :(得分:1)
我认为你也想存储读取行而不只是分配那么多条目的数组。
此外,您不想更改线条然后将其写回,因为在这种情况下您可能最好使用mmap。
两次读取文件总是很糟糕,即使第二次缓存,也需要太多的系统调用。如果您不需要以随机顺序释放它们,如果浪费时间,还要单独分配每一行。
Instead read the entire file at once, into an allocated area.
Find the number of lines by finding line feeds.
Alloc an array
Put the start pointers into the array by finding the same line feeds again.
If you need it as strings, then replace the line feed with \0
在现代cpu架构上也可以改进这一点,而不是两次读取数组,只需为指针分配“足够大”的数组并扫描数组一次就可能更快。这将导致最后的realloc具有正确的大小,并且如果在开始时它不够大,可能会使阵列变大。
为什么这会更快?因为你有很多if
,每行可能需要花费很多时间。所以最好只需要执行一次,成本是重新分配,但使用memcpy复制大型数组可能会更便宜。
但是你必须测量它,你的系统设置,缓冲区大小等也会影响它。
答案 2 :(得分:0)