方法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;
}
结果展示:

作者:徐文焱