Fstream无法创建新文件

IAE*_*IAE 6 c++ file-io file

我正在使用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::openmodestd::ios::in | std::ios::out.当我只标记时std::ios::out,我可以创建文件,但我希望将流保持在读/写状态.

我怎么能做到这一点?

Ate*_*omp 7

最佳方法:

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)

因此代码测试现有文件,如果没有,则创建它.