我需要逐行阅读文本文件。
问题是在我的代码中我不能使用fopen()
然后fgets()
来读取每一行的内容,因为fopen()
在我使用大量线程时失败(似乎因为它被多次打开所以它会过载。
答案 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 CreateFile
和ReadFile
但我真的怀疑这是你的方式......你正试图解决一个在正常程序中永远不会发生的问题。您需要找到问题的根本原因。