用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::stringstd::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读取文本文件的好方法的主要内容,如果未能解决你的问题,请参考以下文章

用C读取文本文件的好方法

打开多行文本文件并仅读取其中的特定行。并将值发送到文本框

delphi写多行文本文件操作

读取一行文本文件,拆分为数组

C语言如何判断文本文档的结束

C语言 统计文本文件中出现的次数最多和最少的字符串