mkae std::ifstream.good() 是否可以手动返回 false?

问题描述 投票:0回答:1

我正在制作一个大量使用

>>
对象的
std::ifstream
运算符的解释器。是否可以按照下面指定的代码行做一些事情:

#include <fstream>

int main() {
    std::ifstream ifstream = std::ifstream();
    ifstream.open("textfile.txt");
    char c = '\0';
    
    ifstream >> c
    if (c != '{') {
        // do something to ifstream object that makes ifstream.good() return false
        // Even when it read a character successfully
        // Reason: c != '{'
    }
    ifstream.close();
}

我想这样做的原因是因为我覆盖了很多对象的

>>
运算符,并且希望在解释器遇到不应该遇到的事情时得到通知,比如文件格式中的语法错误。

作为参考,这是重载运算符的样子:

std::ifstream& operator >> (std::ifstream& ifstream, SomeObject& someObject) {
    // Interpret data
    // Make ifsteeam.good() return false if syntax error found
}

如您所见,我无法返回

bool
值。如果我不能手动让
ifstream.good()
返回
false
,是否有替代和可行的解决方案?我需要这个来让我的代码的其他部分知道在使用那个
ifstream
对象时不应该再阅读。

io c++17 visual-studio-2022 interpreter ifstream
1个回答
2
投票

是的,使用成员函数

setstate

std::ifstream& operator >> (std::ifstream& ifstream, SomeObject& someObject) {
    // process stuff
    if (something_failed) {
        ifstream.setstate(std::ios::failbit);
    }
    return ifstream;
}
© www.soinside.com 2019 - 2024. All rights reserved.