You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何将std::cin传入函数?C++流状态测试编译错误排查

解决C++流状态函数编译错误与参数传递问题

咱们先拆解你遇到的问题:

编译错误的核心原因

你的print_state函数返回类型是void,但在main函数里,你尝试把它的调用结果直接传给std::cout <<

std::cout << "goodbit: " << print_state(std::cin) << std::endl;

std::ostreamoperator<<没有接受void类型的重载,所以编译器会抛出no match for 'operator<<'的错误。

另外,你把std::cin作为const std::istream&参数传递是完全合法的——因为你调用的good()eof()fail()bad()都是流类的const成员函数,不会修改流对象,所以const引用是安全的。

修正方案

有两种简单的方式解决这个问题:

方案1:直接调整调用逻辑

保持print_statevoid返回类型,在main里先输出前缀,再调用函数打印状态,最后换行:

#include <iostream>
#include <sstream>

void print_state(const std::istream& stream) {
    std::cout << " good()=" << stream.good();
    std::cout << " eof()=" << stream.eof();
    std::cout << " fail()=" << stream.fail();
    std::cout << " bad()=" << stream.bad();
}

int main() {
    std::cin.clear(std::ios::goodbit);
    std::cout << "goodbit: ";
    print_state(std::cin);
    std::cout << std::endl;

    std::cin.clear(std::ios::eofbit);
    std::cout << "eofbit: ";
    print_state(std::cin);
    std::cout << std::endl;

    std::cin.clear(std::ios::failbit);
    std::cout << "failbit: ";
    print_state(std::cin);
    std::cout << std::endl;

    std::cin.clear(std::ios::badbit);
    std::cout << "badbit: ";
    print_state(std::cin);
    std::cout << std::endl;

    return 0;
}

方案2:让函数返回字符串

如果你想保持cout链式调用的风格,可以修改print_state让它返回一个std::string,这样就能直接嵌入到输出语句中:

#include <iostream>
#include <sstream>
#include <string>

std::string print_state(const std::istream& stream) {
    std::ostringstream oss;
    oss << " good()=" << stream.good();
    oss << " eof()=" << stream.eof();
    oss << " fail()=" << stream.fail();
    oss << " bad()=" << stream.bad();
    return oss.str();
}

int main() {
    std::cin.clear(std::ios::goodbit);
    std::cout << "goodbit: " << print_state(std::cin) << std::endl;

    std::cin.clear(std::ios::eofbit);
    std::cout << "eofbit: " << print_state(std::cin) << std::endl;

    std::cin.clear(std::ios::failbit);
    std::cout << "failbit: " << print_state(std::cin) << std::endl;

    std::cin.clear(std::ios::badbit);
    std::cout << "badbit: " << print_state(std::cin) << std::endl;

    return 0;
}

补充流状态的关键知识点

  • goodbit:表示流无任何错误状态,此时good()返回true,其他状态检测函数返回false
  • eofbit:流到达末尾时被置位,此时eof()返回truegood()返回falsefail()仅在failbitbadbit被置位时返回true,所以单独设置eofbitfail()false
  • badbit:表示流发生严重错误(比如底层I/O故障),此时bad()返回true,同时fail()也会返回true(因为fail()涵盖了badbit的错误场景)。

内容的提问来源于stack exchange,提问作者aks

火山引擎 最新活动