如何在单个可执行文件中将数据重定向到标准输入?

Posted

技术标签:

【中文标题】如何在单个可执行文件中将数据重定向到标准输入?【英文标题】:How to redirect data to stdin within a single executable? 【发布时间】:2008-09-27 08:32:33 【问题描述】:

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

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

这甚至可能吗?独立于平台的解决方案的奖励积分,但至少,我需要它才能在 Windows 下使用 Visual Studio 9。

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

您应该能够使用 freopen() 将标准输入指向任意文件。

【讨论】:

【参考方案3】:

rdbuf 完全符合您的要求。您可以打开一个文件进行读取并将 cin 的 rdbuf 替换为文件中的rdbuf。 (有关使用 cout 的示例,请参阅链接)。

在类 unix 操作系统上,您可以关闭 0 文件句柄 (stdin) 并打开另一个文件。它将具有最低的可用句柄,在这种情况下为 0。或者使用执行此操作的 posix 调用之一。我不确定,但这可能也适用于 Windows。

【讨论】:

【参考方案4】:

我认为您希望您的类直接使用输入流而不是 std::cin。您需要将输入流传递给类或通过某种方法将其设置在它们上。例如,您可以使用 stringstream 传递您的测试输入:


std::istringstream iss("1.0 2 3.1415");
some_class.parse_nums(iss, one, two, pi);

【讨论】:

【参考方案5】:

我们可以重定向 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);

【讨论】:

以上是关于如何在单个可执行文件中将数据重定向到标准输入?的主要内容,如果未能解决你的问题,请参考以下文章

C - 将标准输入/输出重定向到单个双向文件描述符

Shell学习笔记

如何将标准输入重定向到 Windows 命令行中的文件?

shell基础

如何在 ASP.Net 中将除单个 URL 之外的所有 URL 重定向到 https?

关于数据流重定向