用C读取文本文件的好方法
Posted
技术标签:
【中文标题】用C读取文本文件的好方法【英文标题】:good way to read text file in C 【发布时间】: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,如果需要,提供您自己的实现并不难。)所有可能的行结尾都比较棘手 - 甚至 POSIX getline()
也只处理单个分隔符(就像同一页上的 getdelim()
一样)。
用 fread() 或 read() 读入整个文件,然后搜索 '\n's。使用 mmap() 可以完成类似的操作。
fgetc()
确实有缓冲,getc()
和 getchar()
也是如此。大部分输入都是用“好像通过调用 `getc()”来描述的。
“考虑到效率,即使我在 C++ 中这样做,我仍然会选择 C 库函数来做 IO”:当您分析 C++ 代码时,您发现瓶颈在哪里?
【参考方案1】:
执行 I/O 的正确方法取决于您要如何处理数据。如果您在计算单词,那么基于行的输入没有多大意义。更自然的方法是使用 fgetc 并一次处理一个字符,让 stdio 担心缓冲。只有当你需要在内存中同时处理整行时,你才应该实际分配一个足够大的缓冲区来容纳它。
【讨论】:
以上是关于用C读取文本文件的好方法的主要内容,如果未能解决你的问题,请参考以下文章