c ++将函数输出重定向到已编译的程序输入,反之亦然

Posted

技术标签:

【中文标题】c ++将函数输出重定向到已编译的程序输入,反之亦然【英文标题】:c++ Redirect function output to compiled program input and viceversa 【发布时间】:2016-04-27 12:44:24 【问题描述】:

我有一个已编译的程序,它从 std::cin 接收一些编码数据,对其进行处理并在 std::cout 中输出编码数据。 可执行程序代码如下所示:

// Main_Program.cpp
// Compiled program that processes data.
int main(int argc, char* argv[]) 
    std::string data_in;
    std::string data_out;

    std::cin >> data_in;
    process_data(data_in, data_out);
    std::cout << data_out;

    return 0;

现在我想编写一个程序来测试它。 我有一个对数据进行编码并将其发送到 std::cout 的函数和另一个从 std::cin 接收数据并对其进行解码的函数(我需要使用这些函数,因为它是测试的一部分)。 这些函数如下所示:

void encode_and_send(std::string non_encoded_data) 
    std::string encoded_data;
    encode_data(non_encoded_data, encoded_data);
    std::cout << encoded_data;


void receive_and_decode(std::string &non_encoded_data) 
    std::string encoded_data;
    std::cin >> encoded_data;
    decode_data(encoded_data, non_encoded_data);  

所以我想要一个程序,它使用 encode_and_send 来支持可执行程序,并使用 receive_and_decode 来捕获可执行程序的输出:

我的测试程序如下:

int main(int argc, char* argv[]) 
    std::string testdata = "NonEncodedDataToBeProcessed";
    std::string received_data;

    // How can I use this three calls to correctly handle input and output data? 
    // One option would be to redirect cout and cin to temp files and read them 
    // when calling the ./Main_Program, but is there a way to avoid files and 
    // directily redirect or pipe the inputs and outputs? 

    // encode_and_send(testdata);
    // system("./Main_Program");
    // receive_and_decode(received_data);

    // Here I can check that received_data is correct

    return 0;

谢谢。

【问题讨论】:

您可以使用pipe 与其他进程的标准输入输出句柄进行通信。 【参考方案1】:

您可以创建一个临时fifo并使用它和一个管道将Main_Programstd::cout发送到Test_Programstd::cin反之亦然,类似这样bash:

mkfifo fifo # create a local fifo
Main_Program < fifo | Test_Program > fifo
rm fifo  # don't need it once your finished

【讨论】:

以上是关于c ++将函数输出重定向到已编译的程序输入,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章

输入输出重定向

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

c语言如何将输入输出流重定向到一个字符串?

freopen重定向输入

C语言总结

详解shell输出重定向:>/dev/null 2>&1