为什么 istream::get 将 failbit 和 eofbit 设置在一起?
why istream::get sets failbit and eofbit together?
我想知道为什么 istream::get 将 failbit 和 eofbit 设置在一起。
std::getline 的行为不同:它在遇到文件末尾时设置 eofbit,当您尝试读取超过文件末尾时设置 failbit。所以你可以这样写:
while (std::getline(is, s) {
blablabla... // gets executed once after end of file has been reached
}
而如果您使用 std::get
定义自己的 getSthg 函数
std::istream& myOwnGetLine(std::istream& is, std::string& s) {
char c;
while (is.get(c)) {
blablabla...
}
return is;
}
然后:
while (myOwnGetLine(is, s)) { // fails if eof has been reached
blablabla // won't get executed for the last line of the stream
}
所以:我做错了什么?我想出的解决方法是:
std::istream& myOwnGetLine(std::istream& is, std::string& s) {
*if (is.rdstate() & std::ios::eofbit) {
is.clear(std::ios::failbit);
return is;
}*
char c;
while (is.get(c)) {
blablabla...
}
*if (is.rdstate() & std::ios::eofbit) {
is.clear(std::ios::eofbit);
}*
return is;
}
但这听起来不对...
不幸的是,使用 istream::get
制作 getline
函数会导致该函数内部出现一些笨拙的代码,因为根据规范,它同时设置了 eofbit
和 failbit
当它到达文件末尾时。标准 istream::getline
解决此问题的方法是使用 istream
的 rdbuf()
来检查值。看起来这可能是解决这个问题的唯一方法(除了操纵流的故障状态,即)
我想知道为什么 istream::get 将 failbit 和 eofbit 设置在一起。
std::getline 的行为不同:它在遇到文件末尾时设置 eofbit,当您尝试读取超过文件末尾时设置 failbit。所以你可以这样写:
while (std::getline(is, s) {
blablabla... // gets executed once after end of file has been reached
}
而如果您使用 std::get
定义自己的 getSthg 函数std::istream& myOwnGetLine(std::istream& is, std::string& s) {
char c;
while (is.get(c)) {
blablabla...
}
return is;
}
然后:
while (myOwnGetLine(is, s)) { // fails if eof has been reached
blablabla // won't get executed for the last line of the stream
}
所以:我做错了什么?我想出的解决方法是:
std::istream& myOwnGetLine(std::istream& is, std::string& s) {
*if (is.rdstate() & std::ios::eofbit) {
is.clear(std::ios::failbit);
return is;
}*
char c;
while (is.get(c)) {
blablabla...
}
*if (is.rdstate() & std::ios::eofbit) {
is.clear(std::ios::eofbit);
}*
return is;
}
但这听起来不对...
不幸的是,使用 istream::get
制作 getline
函数会导致该函数内部出现一些笨拙的代码,因为根据规范,它同时设置了 eofbit
和 failbit
当它到达文件末尾时。标准 istream::getline
解决此问题的方法是使用 istream
的 rdbuf()
来检查值。看起来这可能是解决这个问题的唯一方法(除了操纵流的故障状态,即)