创建一个 std::istream ,在读取几个字符后模拟 std::failbit 或 std::badbit

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

我想在成功读取至少五个字符后,使

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`
c++
1个回答
0
投票

std::basic_streambuf
派生自定义类并重写其
virtual
方法来模拟您想要的条件。

然后创建

std::istream
的实例,并将
streambuf
的实例传递给其构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.