Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将字符串注入到';cin&x27;_C++_Iostream - Fatal编程技术网

C++ 将字符串注入到';cin&x27;

C++ 将字符串注入到';cin&x27;,c++,iostream,C++,Iostream,我有一个从std::cin读取用户输入的函数,我想编写一个单元测试,将一些字符串插入std::cin,这样以后从std::cin提取的内容将读取该字符串,而不是暂停键盘输入 理想情况下,我会更改函数签名,以便可以将自定义istream作为参数传递,但我不能在这里这样做,因为我有一个无法更改的固定接口 cin.putback()几乎就是我想要的,但是它一次只插入一个字符,并且以相反的顺序插入(但我在某个地方读到,放回原本不存在的字符可能会很危险,尽管网站没有详细说明原因)。我尝试了几种方法将字符串

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

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

cin.putback()几乎就是我想要的,但是它一次只插入一个字符,并且以相反的顺序插入(但我在某个地方读到,放回原本不存在的字符可能会很危险,尽管网站没有详细说明原因)。我尝试了几种方法将字符串注入cin的内部缓冲区cin.rdbuf(),但都不起作用。我还考虑使用外部测试脚本或创建子进程,但是我想首先考虑纯C++中的测试。
那么,有什么方法可以将字符串放入cin中呢?或者你知道更好的方法注入我的“假键盘输入”吗?

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

如果您真的非常想使用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;    
}
intmain(){
使用名称空间std;
streambuf*备份;
istringstream oss(“测试数据”);
backup=cin.rdbuf();
cin.rdbuf(oss.rdbuf());
字符串str;
cin>>str;

cout保证最多只能使用一个字符,因此您不能
放回整个字符串。请使用包装cin并允许任意
放回()
序列长度的流。我认为有类似的内容,如果没有,则可能有助于实现这样的包装器。

+1.或
stringbuf sb(“testdata”);streambuf*backup=cin.rdbuf(&sb);
。它是兼容的,可移植性很好,但不是很好的做法。哦,是的,他可能必须执行
cin.clear()
以在输入用完后逃离EOF条件:vP.+1正是我要求的(但我个人仍在想,这样做是否是个好主意,即使对于白盒测试代码也是如此)。此解决方案非常棒。如果要将文件作为测试输入传递,则可以通过
ifstream
传入打开的文件;如果只想将字符串作为测试输入传递,则可以简单地传递
istringstream