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
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
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.
Cerrar una secuencia implica flush(), por lo que siempre y cuando close()
cada secuencia antes de abrir la siguiente, debería estar bien.
- 1. Abrir varios archivos (OpenFileDialog, C#)
- 2. ¿Cómo puedo leer y escribir caracteres sin signo en archivos con fstream en C++?
- 3. Cómo abrir y dividir varios archivos
- 4. ¿Cómo leer y escribir varios archivos?
- 5. Configurar Log4net para escribir en varios archivos
- 6. ¿Cómo puedo abrir varios archivos usando "con abierto" en Python?
- 7. ¿Cómo puedo abrir varios archivos a la vez en Vim?
- 8. ¿Cómo puedo abrir archivos en C#
- 9. Java y Android: ¿Cómo abrir varios archivos con un Intento?
- 10. ¿Abrir archivo, escribir y guardar?
- 11. Varios archivos adjuntos en C#
- 12. ¿Cómo puedo obtener mi asociación de archivos para abrir varios archivos en una instancia de programa único?
- 13. ¿Cómo puedo ver varios archivos/socket para poder leer/escribir en Haskell?
- 14. Abrir varios archivos en pestañas nuevas con VIM
- 15. ¿Por qué debo incluir los encabezados iostream y fstream para abrir un archivo
- 16. Abrir archivo para leer y escribir (no anexar) en perl
- 17. ¿Cómo puedo leer, reemplazar y escribir archivos de gran tamaño?
- 18. C# FileStream: Tamaño de búfer óptimo para escribir archivos grandes?
- 19. ¿Puedo dividir mi clase C# en varios archivos?
- 20. Cómo devolver un fstream (C++ 0x)
- 21. Python HDF5 H5Py problemas al abrir varios archivos
- 22. getResourceStream para escribir archivos
- 23. ¿Cómo configuro vim para abrir archivos zip?
- 24. C++ fstream - Creando banderas de formato propias
- 25. Compilación y vinculación de varios archivos en C++
- 26. ¿Tiene varios archivos?
- 27. Cómo incluir varios archivos fuente en C#
- 28. ¿Cómo puedo enviar al cliente varios archivos para descargar
- 29. Escribir varios archivos en una sola solicitud CURL
- 30. Comando MYSQL para ejecutar varios archivos .sql
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. –
¿Hay algo similar para las variables 'FILE'? Me refiero a la reutilización múltiple. Aspecialy por escribirles. 'fclose()' no ayuda. –