对于我想编写的程序,我必须在控制台程序中输入命令并从中读取,我不知道如何操作。
为了理解,或许以下示例的解决方案会有所帮助:
我想编写一个程序,将所有自然数最多为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。但由于我不知道如何更改此代码以满足我的需求,他随后将我送到了这里。
答案 0 :(得分:3)
我认为你真正想要的是将输入传递给辅助程序并获得其输出的方法。
引用的链接说明了如何使用WinAPI函数执行此操作。遗憾的是,Windows上没有更简单的解决方案,因为缺少fork
函数(*)。
以链接作为参考,您必须在源代码//Somehow call square_x.exe
中替换管道和子流程创建(CreatePipe
和CreateProcess
API调用,此处的子进程为square_x.exe
) 。然后要向子进程发送内容,只需在输入管道的写入端使用WriteFile
,并从子进程读取,从输出管道的读取端使用ReadFile
。
但是你的例子会有点困难,因为你的孩子会添加你必须忽略的嘈杂字符串"Input: "
。
尝试将其放入您的代码中,如果您遇到问题,请回到此处再询问另一个问题(使用新代码)。
(*)但你可以找到一个库来处理你所有的血腥细节,例如@ a486408提出的libexecstream。
答案 1 :(得分:2)
您可以尝试使用libexecstream - 它允许您使用c ++ iostream启动新进程并与它们进行通信,而无需深入了解特定于操作系统的内容。