web-dev-qa-db-ja.com

string :: getlineでeofをチェックする

_std::getline_関数を使用してファイルの終わりを確認するにはどうすればよいですか? eof()を使用すると、ファイルの終わりを超えて読み取ろうとするまで、eofに信号を送りません。

37
assassin

C++の標準的な読み取りループは次のとおりです。

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)
}
51
AProgrammer

読んでから、読み取り操作が成功したことを確認します。

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

失敗は多くの原因による可能性があるため、eofメンバー関数を使用して、実際にEOFが発生したことを確認できます。

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

getlineはストリームを返すため、よりコンパクトに記述できます。

 if(!std::getline(std::cin, str))
12
Manuel