Cómo hacer un mapa de ofstreams?
Hay una pregunta similar a esta pero no fue respondida.
Estoy intentando crear un mapa de objetos std::ofstream
pero no puedo compilar el código.
Hasta ahora he intentado lo siguiente:
//std::map<std::string, std::ofstream> my_files; //esto falla
std::map<std::string, std::ofstream& > my_files;
for(auto & member: members){
filename=GetFileName();
//crear el archivo
std::ofstream thefile(filename);
my_files[member.first]=thefile;
}
//Aquí utilizo los objetos ofstream del mapa para escribir, etc.
Intenté la primera línea (comentada) y obtuve este error: Uso de una función eliminada. Así que lo cambié a la línea de arriba, pero aún así obtengo el mismo error: error: uso de la función eliminada ‘std::basic_ofstream<
¿Cómo puedo crear un mapa de objetos ofstream?
Nota: En la pregunta similar, alguien sugirió usar un mapa de cadenas, pero la razón para usar un mapa de objetos ofstream es que no voy a estar abriendo y cerrando el archivo cada vez que quiera hacer un cambio mínimo en cada uno.
davy.ai
La razón del error que estás experimentando es porque los objetos
std::ofstream
no se pueden copiar, por lo tanto no se pueden usar directamente en unstd::map
. Una forma de resolver esto es usar un mapa de punteros a objetosstd::ofstream
en su lugar.Aquí tienes un ejemplo de código:
Al utilizar un
std::unique_ptr
para gestionar el ciclo de vida destd::ofstream
, puedes evitar el problema del constructor de copia.Ten en cuenta que en este ejemplo, he utilizado
std::make_unique
para crearstd::unique_ptr
y asignar el objetostd::ofstream
en el montón (heap). Dependiendo de tu caso de uso específico, es posible que quieras usarstd::shared_ptr
en su lugar si varias partes de tu programa necesitan acceso al mismo archivo.Además, asegúrate de cerrar correctamente los archivos cuando hayas terminado de usarlos, ya que
std::unique_ptr
solo liberará la memoria que gestiona y no cerrará el controlador de archivo por sí mismo.