Я использую FileManager для проекта, так что чтение и запись не доставляют мне хлопот. Или было бы, если бы я не тратил все это время на его отладку. Итак, этот комфорт-класс действительно вызвал у меня стресс и время. Потрясающие.
Проблема, похоже, fstream
. Прежде чем продолжить, вот структура моего класса 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_;
};
Очень просто. Буфер загружается данными во время функции чтения, параметр data - это то, что записывается в файл. Перед чтением и записью вы должны открыть файл или рискнуть получить большое, толстое исключение на вашем лице. Вроде того, что я получаю сейчас.
Сценарий: простая регистрация пользователя в командной строке с последующей записью данных в файл. Я прошу имя и пароль. Имя копируется и добавляется с .txt (имя файла). Так это выглядит так:
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;
}
}
Проблема: не удается открыть. Файл никогда не создается, и во время записи я получаю исключение из-за отсутствия открытого файла.
Функция FileManager :: open ():
void FileManager::open(std::string const& filename)
{
if(stream_.is_open())
stream_.close();
stream_.open(filename.c_str());
}
и напишите
void FileManager::write(std::string const& data)
{
if(stream_.is_open())
stream_ << data;
else
throw FileException("Error. No file opened.\n");
}
Однако, если я создаю файл заранее, то у него нет проблем с открытием файла. Тем не менее, когда я проверяю, по умолчанию std::ios::openmode
составляет std::ios::in | std::ios::out
. Я могу создать файл очень хорошо, когда я только отмечаю std::ios::out
, но я хочу сохранить поток в состоянии чтения / записи.
Как мне это сделать?