checking for eof in string::getline

2019-01-07 09:32发布

How do I check for end-of-file using the std::getline function? If I use eof() it won't signal eof until I attempt to read beyond end-of-file.

2条回答
放荡不羁爱自由
2楼-- · 2019-01-07 09:46

The canonical reading loop in C++ is:

while (getline(cin, str)) {

}

if (cin.bad()) {
    // IO error
} else if (!cin.eof()) {
    // format error (not possible with getline but possible with operator>>)
} else {
    // format error (not possible with getline but possible with operator>>)
    // or end of file (can't make the difference)
}
查看更多
Rolldiameter
3楼-- · 2019-01-07 09:58

Just read and then check that the read operation succeeded:

 std::getline(std::cin, str);
 if(!std::cin)
 {
     std::cout << "failure\n";
 }

Since the failure may be due to a number of causes, you can use the eof member function to see it what happened was actually EOF:

 std::getline(std::cin, str);
 if(!std::cin)
 {
     if(std::cin.eof())
         std::cout << "EOF\n";
     else
         std::cout << "other failure\n";
 }

getline returns the stream so you can write more compactly:

 if(!std::getline(std::cin, str))
查看更多
登录 后发表回答