将字符串注入'cin'

时间:2010-09-26 09:52:26

标签: c++ iostream

我有一个从std :: cin读取用户输入的函数,我想编写一个将一些字符串插入到std :: cin中的单元测试,以便稍后从std :: cin中提取将读取该字符串而不是暂停用于键盘输入。

理想情况下,我会更改函数签名,以便我可以将自定义istream作为参数传递,但我不能这样做,因为我有一个我无法更改的固定界面。

cin.putback()几乎我想要的东西,但是它一次只插入一个字符,并且它以相反的顺序插入它们(但是我读到了某个地方放回了char最初并不存在危险,虽然网站没有详细阐述原因)。我已经尝试了几种方法将字符串注入cin的内部缓冲区cin.rdbuf(),但没有一种方法可以正常工作。我也考虑过使用外部测试脚本或创建子进程,但是我想首先考虑用纯C ++进行测试。

那么,是否有任何方法将字符串放入cin?或者你知道更好的方式来注入我的“假键盘输入”吗?

3 个答案:

答案 0 :(得分:14)

您可以让您的程序接受一般cin,而不是使用std::istream&。正常运行时,只需传递cin即可。在单元测试期间,将其传递给您自己创建的I / O流。

答案 1 :(得分:9)

如果你真的,真的想使用std :: cin,试试这个:

int main() {
  using namespace std;
  streambuf *backup;
  istringstream oss("testdata");
  backup = cin.rdbuf();
  cin.rdbuf(oss.rdbuf());
  string str;
  cin >> str;
  cout << "read " << str;    
}

从备份完成后,您可以恢复std :: cin的streambuf。 我不保证这个的可移植性; P

答案 2 :(得分:0)

cin.butback()保证最多只能使用一个字符,因此您无法回放整个字符串。使用包裹cin的流并允许任意putback()序列长度。我认为Boost.Iostream有类似的东西,如果没有,那么实现这样的包装可能会有所帮助。