我正在使用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_;
};
Run Code Online (Sandbox Code Playgroud)
非常简单.缓冲区在读取功能期间加载数据,数据参数是要写入文件的内容.在阅读和写作之前,你必须打开文件,否则就有可能在你脸上出现一个很大的例外.有点像我现在得到的那个.
场景:简单命令行注册用户,然后将数据写入文件.我要一个名字和密码.该名称将被复制并附加.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;
}
}
Run Code Online (Sandbox Code Playgroud)
问题:打开失败.永远不会创建该文件,并且在写入期间我因没有打开文件而获得异常.
FileManager :: open()函数:
void FileManager::open(std::string const& filename)
{
if(stream_.is_open())
stream_.close();
stream_.open(filename.c_str());
}
Run Code Online (Sandbox Code Playgroud)
和写
void FileManager::write(std::string const& data)
{
if(stream_.is_open())
stream_ << data;
else
throw FileException("Error. No file opened.\n");
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我事先创建文件,那么打开文件没有麻烦.然而,当我检查时,默认std::ios::openmode是std::ios::in | std::ios::out.当我只标记时std::ios::out,我可以创建文件,但我希望将流保持在读/写状态.
我怎么能做到这一点?
最佳方法:
void FileManager::open(std::string const& filename)
{
using std::ios_base;
if( stream_.is_open() )
stream_.close();
stream_.open( filename.c_str() ); // ...try existing file
if( !stream_.is_open() ) // ...else, create new file...
stream_.open(filename.c_str(), ios_base::in | ios_base::out | ios_base::trunc);
}
Run Code Online (Sandbox Code Playgroud)
因此代码测试现有文件,如果没有,则创建它.