将字符串注入'cin'

Lie*_*yan 12 c++ iostream

我有一个从std :: cin读取用户输入的函数,我想编写一个将一些字符串插入std :: cin的unittest,这样以后从std :: cin中提取将读取该字符串而不是暂停键盘输入.

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

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

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

Rei*_*ien 15

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

  • 这个解决方案真的很棒.如果你想传递一个文件作为你的测试输入,你可以通过`ifstream`传入一个打开的文件,或者如果你想传递一个字符串作为你的测试输入,你可以简单地传递`istringstream`. (4认同)

hrn*_*rnt 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;    
}
Run Code Online (Sandbox Code Playgroud)

从备份完成后,您可以恢复std :: cin的streambuf.我不保证这种便携性; P