En utilisant popen
(probablement la solution la plus simple, même si elle n'utilise pas de iostream
C++) de C:
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);
En supposant que votre iostream
a le constructeur non standard xfstream::
xfstream(int fd)
:
FILE *p = popen("echo hello", "r");
std::ifstream p2(fileno(p));
std::string s;
p2 >> s;
p2.close();
pclose(p);
En utilisant Boost.Iostreams, vous n'avez pas à déformer nd sur des extensions non standard iostream
:
boost::iostreams::file_descriptor_source p2(fileno(p));
Malheureusement, Windows est horrible et _popen
ne fonctionne que pour les applications de la console; pour une application graphique:
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]);
(complètement non testé)
http://stackoverflow.com/questions/646868/how-can-i-capture-another-processs-output-using-c –
Le le problème ici est bien entendu que "appel système" n'est pas le même qu'un "appel système()". – MSalters
@alex vasi: merci pour le lien, j'ai fait une recherche mais je n'ai pas trouvé cette page avant de poster la question. – Akusete