自定义 istream 运算符总是返回 false
Custom istream operator always returning false
我遇到这个问题,当我检查是否成功时,我的自定义重载 >> 运算符总是评估为 'false'。我认为这可能与我的 istream 实际上是一个重定向的 ifstream(意味着我将 ifsteam 传递给 isteam)有关,尽管我不确定如何解决它。
这是代码片段,已尽可能简化:
#include <istream>
#include <string>
#include <fstream>
#include <iostream>
class SomeClass {
public:
SomeClass() = default;
friend std::istream& operator>>(std::istream& is, SomeClass& random);
private:
std::string my_str;
};
std::istream& operator>>(std::istream& is, SomeClass& random) {
while(std::getline(is, random.my_str));
if (random.my_str != "Hello World") {
is.setstate(std::ios::failbit);
return is;
}
is.setstate(std::ios::goodbit); //I didn't have this here before, put it in as a test
return is;
}
bool io_parser(std::istream& input_stream) {
SomeClass random;
if (!(input_stream >> random))
return false;
return true;
}
int main(int argc, char* argv[]) {
std::cout << argc << std::endl;
std::istream* input_stream;
std::ifstream input_file(argv[1]);
if (!input_file.is_open()) {
std::cout << "File failed to open." << std::endl;
return EXIT_FAILURE;
}
input_stream = &input_file;
std::cout << io_parser(*input_stream) << std::endl;
return EXIT_SUCCESS;
}
示例输入:
Hello World
Hello World
Hello World
无论如何,只要std::getline()在while()中,它就不会起作用。如果是单独的,就可以。
你有几个问题。
while(std::getline(is, random.my_str));
将一直读取和丢弃行,直到遇到错误。这可能是您想要的,但看起来很奇怪?在此循环之后,流将处于失败状态(通常设置 eof
)。
is.setstate(std::ios::failbit);
正确设置 fail
位。然而
is.setstate(std::ios::goodbit);
不是 return 流到 good
状态的方法。 setstate
将您指定的标志添加到当前流状态,因为 goodbit
实际上是 0
,setstate(std::ios::goodbit)
对流状态没有影响。要设置流状态,您需要调用 clear
:
is.clear(std::ios::goodbit);
或者设置 std::ios::goodbit
你可以不带参数调用:
is.clear();
我遇到这个问题,当我检查是否成功时,我的自定义重载 >> 运算符总是评估为 'false'。我认为这可能与我的 istream 实际上是一个重定向的 ifstream(意味着我将 ifsteam 传递给 isteam)有关,尽管我不确定如何解决它。
这是代码片段,已尽可能简化:
#include <istream>
#include <string>
#include <fstream>
#include <iostream>
class SomeClass {
public:
SomeClass() = default;
friend std::istream& operator>>(std::istream& is, SomeClass& random);
private:
std::string my_str;
};
std::istream& operator>>(std::istream& is, SomeClass& random) {
while(std::getline(is, random.my_str));
if (random.my_str != "Hello World") {
is.setstate(std::ios::failbit);
return is;
}
is.setstate(std::ios::goodbit); //I didn't have this here before, put it in as a test
return is;
}
bool io_parser(std::istream& input_stream) {
SomeClass random;
if (!(input_stream >> random))
return false;
return true;
}
int main(int argc, char* argv[]) {
std::cout << argc << std::endl;
std::istream* input_stream;
std::ifstream input_file(argv[1]);
if (!input_file.is_open()) {
std::cout << "File failed to open." << std::endl;
return EXIT_FAILURE;
}
input_stream = &input_file;
std::cout << io_parser(*input_stream) << std::endl;
return EXIT_SUCCESS;
}
示例输入:
Hello World
Hello World
Hello World
无论如何,只要std::getline()在while()中,它就不会起作用。如果是单独的,就可以。
你有几个问题。
while(std::getline(is, random.my_str));
将一直读取和丢弃行,直到遇到错误。这可能是您想要的,但看起来很奇怪?在此循环之后,流将处于失败状态(通常设置 eof
)。
is.setstate(std::ios::failbit);
正确设置 fail
位。然而
is.setstate(std::ios::goodbit);
不是 return 流到 good
状态的方法。 setstate
将您指定的标志添加到当前流状态,因为 goodbit
实际上是 0
,setstate(std::ios::goodbit)
对流状态没有影响。要设置流状态,您需要调用 clear
:
is.clear(std::ios::goodbit);
或者设置 std::ios::goodbit
你可以不带参数调用:
is.clear();