es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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 un std::map. Una forma de resolver esto es usar un mapa de punteros a objetos std::ofstream en su lugar.

    Aquí tienes un ejemplo de código:

    std::map<std::string,></std::string,><std::ofstream>> mis_archivos;
    
    for(auto & member: members){
       filename = GetFileName();
       //crear el archivo
       auto thefile = std::make_unique<std::ofstream>(filename);
    
       mis_archivos[member.first] = std::move(thefile);
    }
    
    //Aquí, usa los punteros ofstream en el mapa para escribir, etc.
    

    Al utilizar un std::unique_ptr para gestionar el ciclo de vida de std::ofstream, puedes evitar el problema del constructor de copia.

    Ten en cuenta que en este ejemplo, he utilizado std::make_unique para crear std::unique_ptr y asignar el objeto std::ofstream en el montón (heap). Dependiendo de tu caso de uso específico, es posible que quieras usar std::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.

Comments are closed.