我正在爲項目使用FileManager,因此閱讀和寫作對我來說不是一件麻煩事。或者,如果我沒有花這麼多時間調試它。所以,這種舒適等級實際上給我帶來了壓力和時間。真棒。Fstream無法創建新文件
問題似乎是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_;
};
很簡單。在讀取功能期間,緩衝區會載入數據,數據參數是要寫入文件的內容。在閱讀和寫作之前,你必須打開文件或冒險得到一個大的,胖的例外。有點像我現在得到的那個。
場景:簡單的命令行註冊用戶,然後將數據寫入文件。我要求一個名字和密碼。該名稱被複制並附加.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;
}
}
問題:打開失敗。該文件從不創建,並且在寫入期間,我得到一個沒有打開文件的例外。
文件管理:: 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
時,我可以創建該文件,但我希望保持流處於讀/寫狀態。
我該如何做到這一點?
由於C++ 11,`ios_base :: app`本身是允許的,並且等同於「a」。有關更新的表,請參見C++ 11或C++ 14中的表132。 – 2016-01-29 00:19:30