如何进入控制台程序并从中读取

How to enter to and read from a console program?

本文关键字:读取 程序 何进入 控制台      更新时间:2023-10-16

对于我想要编写的程序,我必须向控制台程序输入命令和从控制台程序读取命令,但我不知道如何。

为了便于理解,以下示例的解决方案可能会有所帮助:

我想写一个程序,将所有自然数平方到100,并将结果保存到文本文件中。假设我不知道如何对数字进行平方,因此使用具有以下(不可用)源代码的可执行文件square_x.exe:

#include <iostream>
using namespace std;
int main(){
    double in;
    cout << "Input: ";
    while(cin>>in){
        cout << in << static_cast<char>(253)/*²*/ << " = " << in*in << endl
             << endl
             << "Input: ";
    }
    return 0;
}

那么我必须如何添加到下面的代码片段中呢?(建议,用"不知何故"表示):

#include <fstream>
using namespace std;
ofstream file;
void writeToFile( const char* name, const char* content ){
    file.open( name, ios::app );
    file << content;
    file.close();
}
int main(){
    char buffer[30], buffer2[50];
    //Somehow call square_x.exe
    for( int i = 1 ; i <= 100 ; i++ ){
        //Somehow send i to square_x.exe
        //Somehow get a result from square_x.exe and safe it to buffer2
        //Extract from the got string the result of the calculation
        strtok(buffer2," "); strtok(0, " ");
        strncpy(buffer2,strtok(0, " n"),sizeof(buffer2)-1);
        sprintf( buffer , "%dn%snn" , i , buffer2 ); 
        writeToFile( "list.txt", buffer );
    }
    //Somehow close square_x.exe
    return 0;
}

我问我的一个朋友是否可以帮我,他给我发了这个。但由于我不知道如何更改代码以满足我的需求,他就把我送到了这里。

我认为您真正想要的是将输入传递给辅助程序并获得其输出的方式。

引用的链接解释了如何使用WinAPI函数执行此操作。不幸的是,由于缺少fork函数(*),在Windows上没有更简单的解决方案。

将链接作为引用,您必须在源//Somehow call square_x.exe中使用管道和子进程创建(CreatePipeCreateProcess API调用,此处的子进程为square_x.exe)替换该链接。然后,要向子级发送内容,只需在输入管道的写入端使用WriteFile,而要从子级读取内容,则需要在输出管道的读取端使用ReadFile

但您的示例会有点困难,因为您的孩子添加了嘈杂的字符串"Input: ",您将不得不忽略它。

试着把这个放在你的代码中,如果你被卡住了,回来问另一个问题(用新代码)。

(*)但你可以找到一个为你处理所有血腥细节的库,比如@a486408提出的libexecstream。

您可以尝试使用libexecstream-它允许您启动新进程并使用c++iostream与它们通信,而无需深入研究特定于操作系统的内容。