C++ 如何将数据重定向到单个可执行文件中的stdin?

C++ 如何将数据重定向到单个可执行文件中的stdin?,c++,C++,我用我的C++类的测试框架,并想办法模拟发送数据到通常期望从标准输入接收的类。我有几个不同的文件,我想在不同的测试期间发送到类,所以从命令行重定向到测试套件可执行文件不是一个选项 基本上,我真正想做的是找到一种方法,重新定义或重定向“stdin”句柄到我在程序内部创建的其他值,然后从这些测试中使用fwrite(),以便类内部相应的fread()从程序内部提取数据,不是来自与可执行文件关联的实际标准I/O句柄 这可能吗?对于独立于平台的解决方案来说,这是一个额外的优点,但至少在Windows下使用

我用我的C++类的测试框架,并想办法模拟发送数据到通常期望从标准输入接收的类。我有几个不同的文件,我想在不同的测试期间发送到类,所以从命令行重定向到测试套件可执行文件不是一个选项

基本上,我真正想做的是找到一种方法,重新定义或重定向“stdin”句柄到我在程序内部创建的其他值,然后从这些测试中使用fwrite(),以便类内部相应的fread()从程序内部提取数据,不是来自与可执行文件关联的实际标准I/O句柄


这可能吗?对于独立于平台的解决方案来说,这是一个额外的优点,但至少在Windows下使用Visual Studio 9时,我需要它。

适当的方法是重写类,使其可测试。他们应该接受句柄、流或文件作为参数,从中读取数据-在您的测试框架中,您可以在流中模拟或提供包含测试数据的文件的路径。

您应该能够使用freopen()将stdin指向任意文件。

我认为您希望您的类使用输入流,而不是直接使用
std::cin
。您需要将输入流传递到类中,或者通过某种方法对它们进行设置。对于exmaple,您可以使用
stringstream
传递测试输入:


std::istringstream iss("1.0 2 3.1415");
some_class.parse_nums(iss, one, two, pi);
这正是你想要的。您可以打开一个文件进行读取,并将cin的rdbuf替换为该文件中的rdbuf。(有关使用cout的示例,请参见链接)


在类unix操作系统上,您可以关闭0文件句柄(stdin)并打开另一个文件。它将具有最低可用句柄,在本例中为0。或者使用一个posix调用来实现这一点。我不确定,但这也可以在Windows上工作。

我们可以重定向cin,以便它从文件中读取数据。以下是一个例子:

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::ifstream inputFile("Main.cpp");
    std::streambuf *inbuf = std::cin.rdbuf(inputFile.rdbuf());

    string str;
    // print the content of the file without 'space' characters
    while(std::cin >> str)
    {
        std::cout << str;
    }

    // restore the initial buffer
    std::cin.rdbuf(inbuf);
}
#包括
#包括
#包括
int main()
{
std::ifstream输入文件(“Main.cpp”);
std::streambuf*inbuf=std::cin.rdbuf(inputFile.rdbuf());
字符串str;
//打印不带空格字符的文件内容
而(std::cin>>str)
{
标准::cout