如何构造读取5个字符后触发failbit/badbit的std::istream?
构造触发failbit/badbit的std::istream以通过指定测试函数
需要构造一个std::istream对象,使其在成功读取至少5个字符后触发std::failbit或std::badbit,以此编写单元测试验证代码对这两种状态的处理逻辑。要求下方不可修改的test函数返回true并输出hooray。
不可修改的测试函数
bool test(std::istream &in) { int numchars = 0; while (in.good()) { int c = in.get(); if (c == EOF) { std::cout << "eof encountered" << std::endl; return false; } std::cerr << "read: " << static_cast<char>(c) << std::endl; numchars++; } if (numchars < 5) { std::cout << "too few characters read" << std::endl; return false; } std::cout << "hooray" << std::endl; return true; }
无效尝试示例
尝试1:提前设置failbit
std::stringstream ss("This is a test string."); ss.setstate(std::ios::failbit); test(ss); // 返回false,输出`too few characters read`
原因:提前设置状态会让in.good()直接返回false,读取的字符数为0,不满足至少5个的要求。
尝试2:使用完整字符串流
std::stringstream ss("This is a test string."); test(ss); // 返回false,输出`eof encountered`
原因:字符串流读完所有字符后触发eofbit,此时in.get()返回EOF,函数会直接返回false,无法走到后续的字符数判断逻辑。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

