我正在使用一个文件管理器来进行项目开发,以便读取和写入更加方便。如果我没有花费所有的时间来调试,这会非常有用。然而,这个舒适级别实际上给我带来了压力和时间上的浪费。很棒。
问题似乎出在
非常简单。在读取函数期间,缓冲区会加载数据,数据参数是要写入文件的内容。在读取和写入之前,您必须打开文件,否则可能会在操作中出现异常错误。就像我现在遇到的一样。
场景:用户使用简单的命令行注册,然后将数据写入文件。我要求输入用户名和密码。用户名被复制并附加了.txt(文件名)。所以它看起来像这样:
问题:打开失败。文件从未被创建,在写入时我会因没有打开的文件而得到异常。
FileManager :: open()函数:
然而,如果我事先创建文件,则打开该文件时没有任何问题。 但是,当我检查时, 默认的
我该如何实现这一点?
问题似乎出在
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;
}
}
问题:打开失败。文件从未被创建,在写入时我会因没有打开的文件而得到异常。
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
时,我可以很好地创建文件,但我想将流保持在读/写状态。我该如何实现这一点?
ios_base::app
是允许的,并且等同于"a"。请参阅C++11或C++14中的表132以获取更新后的表格。 - M.M