如何进入和读取控制台程序?

时间:2015-11-18 14:16:58

标签: c++ windows winapi

对于我想编写的程序,我必须在控制台程序中输入命令并从中读取,我不知道如何操作。

为了理解,或许以下示例的解决方案会有所帮助:

我想编写一个程序,将所有自然数最多为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 , "%d\n%s\n\n" , i , buffer2 ); 

        writeToFile( "list.txt", buffer );
    }

    //Somehow close square_x.exe

    return 0;
}

我问我的一个朋友他是否可以帮助我,他送我this。但由于我不知道如何更改此代码以满足我的需求,他随后将我送到了这里。

2 个答案:

答案 0 :(得分:3)

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

引用的链接说明了如何使用WinAPI函数执行此操作。遗憾的是,Windows上没有更简单的解决方案,因为缺少fork函数(*)。

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

但是你的例子会有点困难,因为你的孩子会添加你必须忽略的嘈杂字符串"Input: "

尝试将其放入您的代码中,如果您遇到问题,请回到此处再询问另一个问题(使用新代码)。

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

答案 1 :(得分:2)

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