Estoy usando un FileManager para un proyecto, de modo que la lectura y la escritura no son tan complicadas para mí. O lo sería, si no me hubiera pasado todo este tiempo depurándolo. Entonces, esta clase de confort realmente me causó estrés y tiempo. Increíble.Fstream no puede crear un nuevo archivo
El problema parece ser el fstream
. Antes de seguir adelante, aquí está la estructura de mi clase FileManager.
class FileManager : Utility::Uncopyable
{
public:
FileManager();
void open(std::string const& filename);
void close();
void read(std::string& buffer);
void write(std::string const& data);
private:
std::fstream stream_;
};
Muy simple. El búfer se carga con datos durante la función de lectura, el parámetro de datos es lo que se debe escribir en el archivo. Antes de leer y escribir, debe abrir el archivo o arriesgarse a recibir una gran excepción en su cara. Algo así como el que estoy obteniendo ahora.
Escenario: Registro simple de línea de comandos de un usuario, y luego escribir los datos en un archivo. Pido un nombre y una contraseña. El nombre se copia y se agrega con .txt (el nombre de archivo). Por lo tanto, se ve así:
void SessionManager::writeToFile(std::string const& name,
std::string const& password)
{
std::string filename = name + ".txt";
std::string data;
data += name +", " +password;
try
{
fileManager_->open(filename);
fileManager_->write(data);
fileManager_->close();
}
catch(FileException& exception)
{
/* Clean it up. */
std::cerr << exception.what() << "\n";
throw;
}
}
Problema: la apertura falla. El archivo nunca se crea, y durante la escritura obtengo una excepción por no tener un archivo abierto. función
el FileManager :: Open():
void FileManager::open(std::string const& filename)
{
if(stream_.is_open())
stream_.close();
stream_.open(filename.c_str());
}
y escribir
void FileManager::write(std::string const& data)
{
if(stream_.is_open())
stream_ << data;
else
throw FileException("Error. No file opened.\n");
}
Sin embargo, si se crea el archivo de antemano, entonces no tiene ningún problema de abrir el archivo. Sin embargo, cuando reviso, el valor predeterminado std::ios::openmode
es std::ios::in | std::ios::out
. Puedo crear el archivo muy bien cuando solo marque std::ios::out
, pero quiero mantener la transmisión en un estado de lectura/escritura.
¿Cómo puedo lograr esto?
Desde C++ 11, 'ios_base :: app' por sí mismo está permitido, y es equivalente a" a ". Vea la Tabla 132 en C++ 11 o C++ 14 para la tabla actualizada. –