第一个错误:您正在打开输入文件两次。每C++标准,关于您的第二打开请求的行为(直接调用open
构件):
C++ 11§27.9.1.9 [ifstream.members/3]
void open(const char* s, ios_base::openmode mode = ios_base::in);
效果:请致电rdbuf()->open(s, mode | ios_base::in)
。如果函数 没有返回空指针调用clear(),否则调用 setstate(failbit)(可能会抛出ios_base :: failure(27.5.5.4))。
因此问这个问题,rdbuf()->open(...)
做什么?那么,一个std::ifstream
使用filebuf
为它的缓冲,并再次,按照标准:
C++ 11§27.9.1.4[filebuf.members/2]
basic_filebuf<charT,traits>* open(const char* s, ios_base::openmode mode);
影响:如果is_open()
!= false,则返回空指针。否则,根据需要初始化filebuf。 ...
简而言之,您的双重打开会使您的数据流进入失败状态,这意味着所有与数据相关的操作将从此失败。
第二个错误:错误地在循环条件表达式中使用.eof。一旦修复第一个错误,你会遇到这个问题。这个问题没有得到正确解决的原因在下面的问题中得到了很好的解释,我可以在这里解释它。
Why is iostream::eof inside a loop condition considered wrong?
我只想说,检查你的IO操作,不只是流的EOF状态。进入这种习惯并坚持下去。
固定两种,你的代码可以从字面上减少到简单:
#include <iostream>
#include <fstream>
#include <string>
int main()
{
std::ifstream inputFile("testfile1.txt");
std::string str;
while (std::getline(inputFile, str))
std::cout << str << std::endl;
}
显然,如果你拍摄的更加健壮的代码,你可能需要执行一些错误处理有,像:
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
int main()
{
std::ifstream inputFile("testfile1.txt");
if (!inputFile)
{
std::cerr << "Failed to open file\n";
return EXIT_FAILURE;
}
std::string str;
while (std::getline(inputFile, str))
std::cout << str << std::endl;
}
无关:您打开文件两次? – WhozCraig
不,这是非常相关的。打开同一个文件两次是这里的错误。第二个'open()'失败,并在文件流上设置'fail'位。这里的第二个bug是流行的[while eof bug](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong)。 –
@SamVarshavchik显然代码已经变形了,因为几分钟前条件循环中的逻辑是它现在的反面。去搞清楚。 – WhozCraig