我想在成功读取至少五个字符后,使
istream
对象产生 failbit
或 badbit
。这是编写单元测试以检查我们的代码是否正确处理 failbit
和 badbit
所必需的。
这是一个测试函数:
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;
}
我们无法更改
test
功能。
它应该返回
true
并打印出 hooray
。
以下是一些不起作用的事情:
std::stringstream ss("This is a test string.");
ss.setstate(std::ios::failbit);
test(ss); // returns false, prints out `too few characters read`
std::stringstream ss("This is a test string.");
test(ss); // returns false, prints out `eof encountered`
从
std::basic_streambuf
派生自定义类并重写其 virtual
方法来模拟您想要的条件。
然后创建
std::istream
的实例,并将 streambuf
的实例传递给其构造函数。