2010-02-17 25 views
16

Tengo 10 archivos que deben estar abiertos para escribir en secuencia. ¿Puedo tener un Fstream para hacer esto? ¿Debo hacer algo especial (excepto flush()) entre cada archivo o simplemente llamar al open(file1, fstream::out | std::ofstream::app) para cada archivo y cerrar la secuencia al final de los 10 archivos que se escriben.C++ ¿Puedo reutilizar fstream para abrir y escribir varios archivos?

Respuesta

20

Deberá cerrarlo primero, porque se produce un error al llamar al open en una secuencia ya abierta. (Lo que significa que el indicador failbit se establece en verdadero). Nota close() rubores, por lo que no tiene que preocuparse acerca de que:

std::ofstream file("1"); 
// ... 
file.close(); 
file.clear(); // clear flags 
file.open("2"); 
// ... 

// and so on 

También tenga en cuenta, no es necesario que close() que la última vez; el destructor hace eso por ti (y por lo tanto también por flush()). Esto puede hacer una buena función de utilidad:

template <typename Stream> 
void reopen(Stream& pStream, const char * pFile, 
      std::ios_base::openmode pMode = ios_base::out) 
{ 
    pStream.close(); 
    pStream.clear(); 
    pStream.open(pFile, pMode); 
} 

y se obtiene:

std::ofstream file("1"); 
// ... 
reopen(file, "2") 
// ... 

// and so on 
+4

Es mejor insertar una llamada a 'clear()' entre las llamadas a 'close()' y 'open()', porque los indicadores de estado no se borran. Consulte http://gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.stream_reopening_fails para obtener una explicación detallada. –

+0

¿Hay algo similar para las variables 'FILE'? Me refiero a la reutilización múltiple. Aspecialy por escribirles. 'fclose()' no ayuda. –

2

Sí, pero hay que cerrar la fstream cada vez antes de abrir el siguiente archivo con él.

Sin embargo, es mejor utilizar un nuevo objeto fstream restringidos para cada acceso a archivos para aprovechar los comportamientos constructor y el destructor:

struct { 
    const char *filename; 
    void (*operation)(fstream&); 
} filelist[] = { 
    { "file1", callback1 }, 
    { "file2", callback2 }, 
    ... 
    { "file10", callback10 }, 
}; 

for (int i = 0; i < 10; ++i) { 
    fstream f(filelist[i].filename); 
    filelist[i].operation(f); 
} 

En el ejemplo de código anterior, la fstream se vacía y se cierra cada vez a través del bucle for porque se llama al destructor cuando el objeto pierde alcance. El fstream se pasa por referencia a callback function para que las operaciones se puedan gestionar por archivo sin una desagradable instrucción de conmutación. Si la operación es la misma para cada archivo, entonces esa construcción puede eliminarse.

2

Cerrar una secuencia implica flush(), por lo que siempre y cuando close() cada secuencia antes de abrir la siguiente, debería estar bien.

Cuestiones relacionadas