现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

控制台程序的管道重定向

2014-03-19 06:27 工业·编程 ⁄ 共 2307字 ⁄ 字号 暂无评论

(1) 写一个add.exe文件,代码如下

#include "iostream"

using namespace std;

int main()

{

int a, b;

while(cin>>a>>b)

{

cout<<a+b<<endl;

}

return 0;

}

编译生成add.exe,在步骤3中会用到

(2)写一个输入文件in.txt,写入数据,

格式为每行仅有两个整数,两个整数之间用空格隔开

数据可以有多行

最后一行只有一个空字符(Tab键上面的键)

例:

2 5

45 65

1 -88

·

(3)

新建一个win32 console application空工程,再新建一个main.cpp文件,写入以下代码,编译生成相应的exe文件,

将(1)、(2)中的文件拷贝到工程main.cpp所在的目录当中和工程目录下Debug目录当中

#include "windows.h"

#include "iostream"

using namespace std;

HANDLE hRead,hWrite,dWrite,dRead;

DWORD WINAPI ThreadRead(LPVOID lpParameter) //读取线程

{

DWORD dw=-1;

char temp[4096];

while(dw != 0)

{

memset(temp,0,4096);

ReadFile(hRead,temp,4096,&dw,0);

if(dw!=0)

{

cout<<temp;

}

}

return 0;

}

void Read()

{

HANDLE handle = CreateThread(NULL, 0, ThreadRead, NULL, 0, NULL); //创建读取线程

if(! handle)

{

MessageBox(NULL,"创建线程失败","Tip",0);

return ;

}

CloseHandle(handle);

}

int main(int argc, char * argv[])

{

DWORD ErrorCode;

DWORD dw=-1;

HANDLE hFile;

OFSTRUCT FileInfo;

char ErrorString[500];

SECURITY_ATTRIBUTES sa; //创建安全信息结构体

sa.bInheritHandle=true;

sa.lpSecurityDescriptor=0;

sa.nLength=sizeof(sa);

CreatePipe(&hRead,&hWrite,&sa,4096); //创建输出管道

if(ErrorCode = GetLastError())

{

cout<<"创建输入管道失败!"<<endl;

FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ErrorCode, LANG_SYSTEM_DEFAULT, ErrorString, 500, NULL);

cout<<ErrorString<<endl;

return 1;

}

CreatePipe(&dRead,&dWrite,&sa,4096); //创建输入管道

if(ErrorCode = GetLastError())

{

cout<<"创建输出管道失败!"<<endl;

FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ErrorCode, LANG_SYSTEM_DEFAULT, ErrorString, 500, NULL);

cout<<ErrorString<<endl;

return 2;

}

hFile = (HANDLE)OpenFile("in.txt", &FileInfo, OF_READ);

if(ErrorCode = GetLastError())

{

cout<<"打开输入文件失败!"<<endl;

FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ErrorCode, LANG_SYSTEM_DEFAULT, ErrorString, 500, NULL);

cout<<ErrorString<<endl;

return 1;

}

STARTUPINFO si; //创建进程开始信息结构体

GetStartupInfo(&si);

si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;

si.wShowWindow = SW_HIDE;

si.hStdOutput = hWrite;

si.hStdInput = dRead;

PROCESS_INFORMATION pi; //创建进程

CreateProcess("add.exe", NULL, NULL, NULL, true, 0, NULL, NULL, &si, &pi);

if(ErrorCode = GetLastError())

{

cout<<"创建进程失败!"<<endl;

FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ErrorCode, LANG_SYSTEM_DEFAULT, ErrorString, 500, NULL);

cout<<ErrorString<<endl;

return 3;

}

char data[4096];

memset(data, 0, sizeof(data));

ReadFile(hFile, data, 4096, &dw, 0);

WriteFile(dWrite, data, strlen(data), &dw, NULL);

Read();

return 0;

}

注意:如果是映射CMD的命令,则要在每个命令字符串后追加一个换行符 ‘\n’

(4)完成以上的步骤就可以执行了,(3)中的程序就是重新定向(1)中的add.exe的输入和输出。

给我留言

留言无头像?