Wie zu lesen / Ausgabe eines DOS-Befehl an eine Programmvariable in C / C ++ umleiten?

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

  •  05-07-2019
  •  | 
  •  

Frage

Ich mag einen DOS-Befehl von meinem Programm zum Beispiel „dir“ Befehl auszuführen. Ich tue es mag,

system("dir");

Gibt es eine Möglichkeit, die Ausgabe dieses Befehls direkt in eine Programmvariable zu lesen?

Wir können immer die Ausgabe in eine Datei umleiten und dann diese Datei lesen, indem Sie
system("dir > command.out");

Und dann liest command.out Datei. Aber wie können wir es direkt tun, anstatt in eine Datei redirectling und dann lesen?

War es hilfreich?

Lösung 3

Haben Sie einen alternativen Weg oder besser gesagt Fenster Äquivalent von popen. Es ist _popen (). Dies funktioniert für mich genau richtig und es ist darüber hinaus einfach zu bedienen.

   char   psBuffer[128];
   FILE   *pPipe;

   if( (pPipe = _popen( "dir", "rt" )) != NULL)
  {
     while(fgets(psBuffer, 128, pPipe))
     {
       printf(psBuffer);
     }
  }

Die Details mit vollem Beispiel hier .

Andere Tipps

Sie können es nicht umleiten auf eine Variable, aber Sie können einen Trick ähnlich, wie Rohre tun für die Verkettung Befehle in Unix verwendet werden. Rufen Sie CreateProcess() , und es hat eine STARTUPINFO Instanz übergeben mit entsprechend eingestellt Griffen und STARTF_USESTDHANDLES in STARTUPINFO::dwFlags. Dann lesen Sie die Daten aus dem erzeugten Prozess durch den Satz Griffe kommen.

Wenn Ihre Bibliothek POSIX-Funktion popen() hat, dann ist es das, was Sie brauchen. Sie können Befehlsausgabe von Rohr lesen und analysieren es jede mögliche Weise, die Sie mögen.

FILE *dir;
char direntry[80];

dir = popen("dir", "r");
while (!feof(dir)) {
    fgets(direntry, sizeof(direntry), dir);
    /* do something with direntry */
}

Sie können nicht. Die Programme in verschiedenen Speicherbereichen laufen, da sie unterschiedliche Prozesse sind. Im Allgemeinen wird in modernen Betriebssystemen, Prozesse nicht einen gemeinsamen Speicher zu.

Auch würde es schwierig sein, eine Variable in C zu definieren, die die Ausgabe eines Befehls, wie beispielsweise „dir“ halten können; es müßte ist dynamisch Platz machen wachsen.

Der beste Weg, zu verwenden ist ein Rohr < das macht es möglich, die Ausgaben des Befehls aus einem Stream zu lesen / a>, von dem Sie es speichern, wie Sie sehen, passen.

Mit popen () es tut genau das, was Sie wollen.
Es schafft eine bidirektionale Leitung, Gabeln der Prozesse. In dem Kind verbindet es dann um das Rohr zu Standard in und Standard aus dann der Befehl als ersten Parameter angegeben execs popen ().

#include <stdio.h>
#include <string>
#include <iostream>

int main()
{
    std::string     output;
    FILE*           data    = popen("cat PLOP","r");

    for(char c = getc(data);c != EOF;c = getc(data))
    {
        output  += c;
    }
    pclose(data);

    std::cout << "Data(" << output << ")\n";
}
scroll top