首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使iostream更加严格

使iostream更加严格
EN

Stack Overflow用户
提问于 2021-05-17 16:24:05
回答 3查看 54关注 0票数 1

有没有办法让iostream对布尔值有更严格的要求?

我使用std::boolalpha得到了意想不到的结果

代码语言:javascript
复制
bool var;
std::istringstream is("true1");
is >> std::boolalpha >> var;

生成var == trueis.good() == 1is.peek() == '1',而我期望的是is.good() == 0

未指定boolalpha时的类似行为:

代码语言:javascript
复制
bool var;
std::istringstream is("1qwe");
is >> var;

生成var == trueis.good() == 1is.peek() == 'q',而我期望的是is.good() == 0

EN

回答 3

Stack Overflow用户

发布于 2021-05-17 16:32:34

不,没有办法以这种方式使iostream更加严格。

也没有必要这样做。例如,只需使用is.peek()检查是否使用了整个输入。如果不是,则将输入视为错误,然后重试(或者在case is.good() == 0中执行任何您想做的操作)。

票数 4
EN

Stack Overflow用户

发布于 2021-05-17 16:54:00

所有格式化输入函数在成功读取项目后停止,并在该项目结束后立即设置位置(在下一个字符上)。

您可以只测试peek是否返回特征::eof():

代码语言:javascript
复制
if (is.peek() != std::istringstream::traits_type::eof()) {
    // invalid input
    ...
}
票数 2
EN

Stack Overflow用户

发布于 2021-05-17 17:32:08

您不能使流更严格,但您可以定义一个更“严格”流的包装类。

以下内容(对流状态管理的正确性持保留意见):

代码语言:javascript
复制
template<typename T>
class stricter_io
{
public:
    explicit stricter_io(T& t) : t(t) {}

    friend std::istream& operator>>(std::istream& is, stricter_io<T>&& val)
    {
        auto pos = is.tellg();
        if (is >> val.t)
        {
            // Whatever condition you want; 
            // this examples requires either eof or whitespace after the item.
            auto next = is.peek();
            if (next != std::istringstream::traits_type::eof()
                && !std::isspace(next))
            {
                // Rewind the stream and enter the failure state.
                is.seekg(pos);
                is.setstate(std::ios_base::failbit);
            }
        }
        return is;
    }

private:
    T& t;
};


int main()
{
    bool var;
    std::istringstream is("true1");
    if (is >> std::boolalpha >> stricter_io(var))
    {
        std::cout << "Good";
    }
    else
    {
        std::cout << "Bad\n";
        is.clear();
        std::string s;
        is >> s;
        std::cout << s << std::endl;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67566228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档