【发布时间】:2012-01-29 23:08:24
【问题描述】:
我需要阅读一个可能包含长行文本的文本文件。我正在考虑最好的方法来做到这一点。考虑到效率,即使我在 C++ 中这样做,我仍然会选择 C 库函数来做 IO。
因为我不知道一行有多长,可能真的很长,我不想分配一个大数组然后使用fgets 读取一行。另一方面,我确实需要知道每行的结束位置。这种情况的一个用例是计算每一行中的单词/字符。我可以分配一个小数组,使用fgets来读取,然后判断行中是否出现\r,\n,或者\r\n来判断是否读取了整行。但这涉及到大量的strstr 调用(对于\r\n,还是有更好的方法?例如从fgets 的返回值?)。我也可以 fgetc 一次读取每个单独的字符。但是这个函数有缓冲吗?
请建议比较这些或其他不同的方式来完成这项任务。
【问题讨论】:
-
使用 C++ 和
std::string和std::getline。为什么不?在您声称它太慢之前配置文件。 -
注意
fgets()在正常情况下不会将\r读作行尾。查看 POSIX 2008 和getline(),但要注意使用它的可移植性影响。 (OTOH,如果需要,提供您自己的实现并不难。)所有可能的行结尾都比较棘手 - 甚至 POSIXgetline()也只处理单个分隔符(就像同一页上的getdelim()一样)。 -
用 fread() 或 read() 读入整个文件,然后搜索 '\n's。使用 mmap() 可以完成类似的操作。
-
fgetc()确实有缓冲,getc()和getchar()也是如此。大部分输入都是用“好像通过调用 `getc()”来描述的。 -
“考虑到效率,即使我在 C++ 中这样做,我仍然会选择 C 库函数来做 IO”:当您分析 C++ 代码时,您发现瓶颈在哪里?
标签: c