2012-05-19 27 views
17

La forma bien conocida de la creación de un objeto fstream es:Crear objeto fstream desde un archivo * puntero

ifstream fobj("myfile.txt"); 

es decir. usando un nombre de archivo.

Pero quiero crear un objeto ifstream usando un descriptor de archivo.

Motivo: Quiero ejecutar un comando usando _popen()._popen() devuelve la salida como FILE*. Entonces, hay un puntero FILE * involucrado pero no un nombre de archivo.

+1

@ Joe: Posix descriptores de fichero son otra cosa. Presumiblemente, tanto C++ iostreams como C I/O se implementan en términos de ellos en una plataforma Posix. La presente pregunta es más razonable, sin embargo, dado que ambos iostreams * y * C I/O son parte de la biblioteca estándar. –

+0

este es un duplicado de http://stackoverflow.com/questions/2746168/how-to-construct-ac-fstream-from-a-posix-file-descriptor dado que puede usar 'fileno' en el' FILE * ' devuelto de 'popen' – Alnitak

Respuesta

3

No puede hacer eso solo en C++ estándar, ya que iostreams y C I/O son completamente independientes y no están relacionados. Sin embargo, puede escribir su propio iostream respaldado por una secuencia C FILE. Creo que GCC viene con una de esas clases de flujo como una extensión de biblioteca.

Alternativamente, si todo lo que quiere es una forma objetiva de envolver un flujo C FILE, podría use a unique pointer para ese propósito.

+0

Básicamente quiero leer la salida de _popen() en una sola cadena. Una pequeña investigación me llevó a fstream. Por favor sugiera algo a ese contexto. –

+1

@ahmedtabrez: simplemente ve con 'std :: fread' como de costumbre; usa un buffer intermedio y agrega los bytes que lees a tu cadena de resultados. O mira en esas extensiones GCC. –

+0

Por favor, podemos discutir aquí: http://chat.stackoverflow.com/rooms/11467/room-for-ahmedtabrez-and-kerrek-sb –

-1

Puede crear una cadena y usar fread para leerla y anexarla. No está limpio, pero estás trabajando con una interfaz C.

Algo como esto debería funcionar:

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); 
Cuestiones relacionadas