2013-05-21 74 views
2

此代码始终打印文件的最后一行。我期望它从文件中一次打印出所有文本。任何想法为什么它不起作用?使用getline()从文件读取时出错无法使用C++

string filename; 
cout << "File to read: "; 
cin >> filename; 

ifstream afile; 
afile.open(filename.c_str()); 

string line; 
while(!afile.eof()) { 
    getline(afile, line); 
    cout << line; 
} 

afile.close(); 

尝试这种方式做同样的事情:

for (string line; getline(afile, line);) { 
    cout << line; 
} 

也许这是我的终端的问题吗?这工作...

for (string line; getline(afile, line);) { 
    cout << line << endl; 
} 
+0

http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong – chris

+0

我没有在for循环中检查eof,为什么它会这样做一样? – David

+0

出了什么问题?怎么了? –

回答

1

问题是只打印最后一行。正确?

  1. 我建议你在while循环中加上std::endl。它可以使问题更清楚。有时输出可能会令人困惑。
  2. 您还可以检查输入文件中的行分隔字符。 '\n'getline的默认分隔符。如果使用不同的字符,请将其指定为getline的第3个参数。
+0

奇怪的是,它在打印时在终端上写每行。如果我在每个cout之后添加一个endl,那么一切都按预期工作。 – David

+0

如果最后一行比以前更短,那就更明显了。然后我看到它实际上写在该行的上方(因为我可以看到从上一行添加到末尾的字符)。 – David

+0

它似乎是流缓冲区溢出。您可以检查流的状态。找到会发生什么很有帮助。你可以使用std :: cout.rdstate()。 – ajtomato

1

cplusplus.com

如果找到定界符,则提取并丢弃,即,它是 不存储和之后的下一个输入操作将开始。

由于您的原始代码片段本身并未插入任何额外的换行符,因此没有任何操作使输出到终端进入下一行。当输出用完水平空间时,接下来发生的事是由终端决定的。我不确定你使用的是什么终端,但在你的情况下,它只是将光标换回到该行的第一个字符而没有换行。在Windows命令外壳上,它只是包装到下一行。

还要注意的是:

while(!afile.eof()) { 
    getline(afile, line); 
    cout << line; 
} 

是一种常见的反模式。正如已经指出的那样,更合适的是:

while(getline(afile, line)) { 
    cout << line << '\n'; 
} 

文件流只有在您到达eof并尝试从中读取后才会变为false。

相关问题