自定义 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 实际上是 0setstate(std::ios::goodbit) 对流状态没有影响。要设置流状态,您需要调用 clear:

is.clear(std::ios::goodbit);

或者设置 std::ios::goodbit 你可以不带参数调用:

is.clear();