2012-05-19 16 views
17

Il noto modo di creare un oggetto fstream è:Creazione oggetto fstream da un puntatore FILE *

ifstream fobj("myfile.txt"); 

esempio. usando un nome di file.

Ma voglio creare un oggetto ifstream utilizzando un descrittore di file.

Motivo: voglio eseguire un comando utilizzando _popen()._popen() restituisce l'output come FILE*. Quindi c'è un puntatore FILE * coinvolto ma nessun nome file.

+1

@ Joe: descrittori di file POSIX sono ancora un'altra cosa. Presumibilmente, sia iostream che C++ e C I/O sono implementati in termini di essi su una piattaforma Posix. La presente domanda è più ragionevole, tuttavia, dal momento che entrambi iostream * e * C I/O fanno parte della libreria standard. –

+0

questo è un duplicato di http://stackoverflow.com/questions/2746168/how-to-construct-ac-fstream-from-a-posix-file-descriptor dato è possibile utilizzare 'fileno' sulla' 'FILE * restituito da 'popen' – Alnitak

risposta

3

Non è possibile farlo solo in C++ standard, poiché iostreams e C I/O sono completamente separati e non correlati. È comunque possibile scrivere il proprioiostream che è supportato da un flusso C FILE. Credo che GCC abbia una di queste classi di stream come estensione di libreria.

In alternativa, se tutto ciò che si desidera è un modo object-y di avvolgere un flusso C FILE, è possibile use a unique pointer per tale scopo.

+0

Fondamentalmente voglio leggere l'output di _popen() in una stringa singola. Una piccola ricerca mi ha portato a fstream. Si prega di suggerire qualcosa per quel contesto. –

+1

@ahmedtabrez: Basta andare con 'std :: fread' come al solito; utilizzare un buffer intermedio e aggiungere i byte letti alla stringa dei risultati. Oppure guarda in quelle estensioni GCC. –

+0

Per favore, possiamo discutere qui: http://chat.stackoverflow.com/rooms/11467/room-for-ahmedtabrez-and-kerrek-sb –

-1

È possibile creare una stringa e utilizzare il tasto per leggerlo e aggiungerlo. Non è pulito, ma stai lavorando con un'interfaccia C.

Qualcosa del genere dovrebbe funzionare:

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); 
Problemi correlati