不使用fopen()逐行读取文本文件

时间:2014-02-14 10:05:42

标签: c file-processing

我需要逐行阅读文本文件。

问题是在我的代码中我不能使用fopen()然后fgets()来读取每一行的内容,因为fopen()在我使用大量线程时失败(似乎因为它被多次打开所以它会过载。

5 个答案:

答案 0 :(得分:0)

你可以使用getline() 您需要指定分隔符和while或for循环以在达到EOF时停止。

编辑:你说你不想使用fopen()和fgets()等等:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main () {
  string line;
  ifstream myfile ("example.txt");
  if (myfile.is_open())
  {
    while (! myfile.eof() )
    {
      getline (myfile,line);
     if (line = something)
      {
      // read next line and print it... but how?
      }
    myfile.close();
  }

  else cout << "Unable to open file"; 

  return 0;
}

答案 1 :(得分:0)

大多数操作系统对特定进程可以同时打开的文件数量有限制。由于fopen()只是open()之上的“包装”,如果这是您的问题,则无法使用较低级别的界面。

您可以通过在errno失败时检查fopen()来确认这确实是您的问题,即如果它返回NULL。你听起来好像已经这样做了,但你不是很具体。如果您遇到每个进程限制,我希望EMFILE(请参阅open() manual page)。

您需要调查您的特定限制,看看您是否可以更改它们,或重新设计您的程序,以便您不会并行打开任意数量的文件。

答案 2 :(得分:0)

您可以使用开放式(man open (2))和阅读式(man read(2))。

fopen()的真正问题是什么?

答案 3 :(得分:0)

如果打开/读取工作并且fopen / fread不起作用,这可能是因为你的锁定结构已经用完了。在循环中使用unlocked_getc(读取直到获得换行符)可能是最简单的选择。

答案 4 :(得分:0)

有些人建议您使用open(2)read(2)作为fopen(3)fgets(3)的替代品,但由于它们是Unix(Linux和OS X)API,因此您不能在Windows上与Borland一起使用它们。与Windows上open(2)read(2)对应的内容是Win32 API CreateFileReadFile

但我真的怀疑这是你的方式......你正试图解决一个在正常程序中永远不会发生的问题。您需要找到问题的根本原因。