c++获取控制台程序的输出(控制台输出重定向)
方法1:
利用windows命令>x.txt把控制台内容重定向写入x.txt中,然后通过std::ifstream读取x.txt中的内容以达到获取控制台输出的目的。这个方法过程比较曲折,不可控因素太多,所以不推荐,贴出来仅供参考。
代码如下:
#include <iostream> #include<fstream> int main() { // 先清空文件,防止输出内容与上次内容叠加 std::ofstream ofile("1.txt"); if (ofile.is_open()) { ofile.clear(); ofile.close(); } system("Ping.exe 192.168.75.1 >>1.txt"); std::ifstream ifile("1.txt"); if (ifile.is_open()) { std::streampos pos = ifile.tellg(); ifile.seekg(0, std::ios::end); int len = (int)ifile.tellg(); ifile.seekg(pos); char* buffer = new char[len + 1]{ 0 }; ifile.read(buffer, len); std::cout << buffer << std::endl; ifile.close(); } getchar(); return 0; }
结果展示:
方法2:
利用STARTUPINFO结构中的hStdError和hStdOutput对象,把控制台的输出重写向到我们自己创建的管道中,然后通过管道对象,即可顺利获取控制台的输出,这个方法是推荐使用的。
代码如下:
#include <iostream> #include <windows.h> int main() { HANDLE hRead, hWrite; //管道的读写句柄 SECURITY_ATTRIBUTES sa; //管道安全属性相关结构体 sa.nLength = sizeof(SECURITY_ATTRIBUTES); //结构体长度赋值 sa.lpSecurityDescriptor = NULL; //NULL管道默认安全描述符,管道的安全属性将继承与父程序 sa.bInheritHandle = TRUE; //一个布尔值,指定在创建新进程时是否继承返回的句柄。如果此成员为TRUE,则新进程将继承该句柄。 if (!::CreatePipe(&hRead, &hWrite, &sa, 0)) { //尝试创建管道,失败则弹出提示并退出 ::MessageBox(0, L"Error on CreatePipe()", 0,0); return 1; } STARTUPINFO si; //启动信息结构体 PROCESS_INFORMATION pi; //进程信息结构体 si.cb = sizeof(STARTUPINFO); //初始化启动信息结构体大小 ::GetStartupInfo(&si); //获取父进程的启动信息,利用这个函数我们可以只需要修改较少的参数值 si.hStdError = hWrite; //重定向错误信息输出到管道 si.hStdOutput = hWrite; //重定向标准输出新信息到管道 si.wShowWindow = SW_HIDE; //设定子进程窗体是否隐藏 si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; //wShowWindow成员将包含其他信息;hStdInput,hStdOutput和hStdError成员包含其他信息。 if (!::CreateProcess( L"C:\Windows\System32\Ping.exe", (LPWSTR)L"-t 192.168.75.1", NULL, NULL, TRUE, //新进程继承父进程相关权限 NULL, NULL, NULL, &si, &pi) ) { ::MessageBox(0, L"Error on CreateProcess()", 0, 0); return 1; } ::CloseHandle(pi.hThread); ::CloseHandle(pi.hProcess); ::CloseHandle(hWrite); //关闭管道写入句柄 std::string result; char buffer[1025] = { 0 }; DWORD bytesRead; while (true) { //读取管道内的数据 memset(buffer, 0, 1025); if (::ReadFile(hRead, buffer, 1024, &bytesRead, NULL) == NULL) break; result += buffer; ::Sleep(100); } std::cout << result << std::endl; getchar(); return 0; }
结果展示: