2012-05-19 11 views
17

Die bekannte Art und Weise ein fstream Objekt zu schaffen ist:Erstellen fstream Objekt aus einer Datei * pointer

ifstream fobj("myfile.txt"); 

dh. einen Dateinamen verwenden.

Aber ich möchte ein ifstream-Objekt mit einem Dateideskriptor erstellen.

Grund: Ich möchte einen Befehl auszuführen, mit _popen()._popen() gibt die Ausgabe als FILE* zurück. Es ist also ein FILE * -Zeiger vorhanden, aber kein Dateiname.

+1

@ Joe: Posix Filedeskriptoren sind noch eine andere Sache. Vermutlich werden sowohl C++ - Iostreams als auch C-I/O in Bezug auf sie auf einer Posix-Plattform implementiert. Die vorliegende Frage ist jedoch vernünftiger, da sowohl iostreams * als auch * C I/O Teil der Standardbibliothek sind. –

+0

Dies ist ein Duplikat von http://stackoverflow.com/questions/2746168/how-to-construct-ac-fstream-from-a-posix-file-descriptor, vorausgesetzt, Sie können 'fileno' auf' FILE * 'verwenden zurückgegeben von 'popen' – Alnitak

Antwort

3

Sie können das nicht nur in Standard C++ tun, da Iostreams und C I/O vollständig getrennt und unabhängig sind. Sie könnten jedoch Ihr eigenes iostream schreiben, das von einem C FILE-Stream unterstützt wird. Ich glaube, dass GCC mit einer solchen Stream-Klasse als Bibliothekserweiterung kommt.

Alternativ, wenn alles, was Sie wollen, ist ein Objekt-y-Weg zum Umhüllen eines C FILE-Stream, könnten Sie use a unique pointer für diesen Zweck.

+0

Grundsätzlich möchte ich _popen() 's Ausgabe in eine einzige Zeichenfolge lesen. Eine kleine Recherche führte mich zu fstream. Bitte schlage etwas zu diesem Kontext vor. –

+1

@ahmededabrez: Gehen Sie einfach wie gewohnt mit 'std :: fread'; Verwenden Sie einen Zwischenpuffer und hängen Sie die gelesenen Bytes an die Ergebniszeichenfolge an. Oder schauen Sie sich diese GCC-Erweiterungen an. –

+0

Bitte, können wir hier diskutieren: http://chat.stackoverflow.com/rooms/11467/room-for-ahmedtabrez-and-kerrek-sb –

-1

Sie können eine Zeichenfolge erstellen und fread zum Lesen und Anhängen verwenden. Es ist nicht sauber, aber Sie arbeiten mit einer C-Schnittstelle.

So etwas sollte funktionieren:

FILE * f = popen(...) 
const unsigned N=1024; 
string total; 
while (true) { 
    vector<char> buf[N]; 
    size_t read = fread((void *)&buf[0], 1, N, f); 
    if (read) { total.append(buf.begin(), buf.end()); } 
    if (read < N) { break; } 
} 
pclose(f); 
Verwandte Themen