La captura de la salida estándar de llamada al sistema sin escribir en el archivo en C / C ++

StackOverflow https://stackoverflow.com/questions/1103047

  •  12-09-2019
  •  | 
  •  

Pregunta

Quiero leer la salida std de una llamada al sistema en una cadena de C / C ++. ¿Puedo hacer esto sin necesidad de utilizar un archivo temporal?

Perl

//without file io
$output = `echo hello`;

C ++

//with file io
system ("echo hello > tmp");
std::fstream file ("tmp");
std::string s;
file >> s;
¿Fue útil?

Solución

Uso de C popen (probablemente la solución más sencilla, incluso si no lo hace utilizar C ++ 's iostream):

FILE *p = popen("echo hello", "r");
std::string s;
for (size_t count; (count = fread(buf, 1, sizeof(buf), p));)
    s += string(buf, buf + count);
pclose(p);

Asumiendo que su iostream tiene el no estándar x fstream:: x fstream(int fd) constructor:

FILE *p = popen("echo hello", "r");
std::ifstream p2(fileno(p));
std::string s;
p2 >> s;
p2.close();
pclose(p);

Boost.Iostreams , usted no tiene a depender de extensiones no estándar a iostream:

boost::iostreams::file_descriptor_source p2(fileno(p));

Por desgracia, Windows es horrible y _popen sólo funciona para la consola aplicaciones; para una aplicación gráfica:

SECURITY_ATTRIBUTES sec;
sec.nLength = sizeof(sec);
sec.bInheritHandle = TRUE;
sec.lpSecurityDescriptor = NULL;
HANDLE *h[2];
CreatePipe(&h[0], &h[1], &sec, 0);
SetHandleInformation(h[0], HANDLE_FLAG_INHERIT, 0)
STARTUPINFO si;
memset((void *)&si, 0, sizeof(si));
si.hStdInput = INVALID_HANDLE_VALUE;
si.hStdOutput = h[1];
si.hStdError = INVALUD_HANDLE_VALUE;
si.dwFlags |= STARTF_USESTDHANDLES;
CreateProcess(NULL, "cmd /c \"echo hello\"", NULL, NULL, TRUE, 0, NULL, NULL, &si, NULL);
boost::iostreams::file_descriptor_source p(h[0]);

(completamente no probado)

Otros consejos

Esto podría ayudar que redirigir la salida estándar de una llamada al sistema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top