std :: ofstream:使用append和out标志写入文件

时间:2014-07-14 13:55:54

标签: c++ stl ofstream

下面是一个简单的类,它尝试将整数写入文件。写入文件的方式是在文件末尾附加字符(在此模式下,如果文件不存在,则应创建文件)

#include <iostream>
#include <fstream>

class TestFileStream
{
private:

    std::ofstream* _myFileStream;
    bool isFileOpen;

public:

    TestFileStream():isFileOpen(false)
    {
        _myFileStream = new std::ofstream("TestFile.txt", std::ios_base::out | std::ios_base::app );
        isFileOpen = _myFileStream->is_open();

        if( !isFileOpen  )
        {
            std::cout << "Unable to open log file" << std::endl;
            std::cout << "Good State: " << _myFileStream->good() <<std::endl;
            std::cout << "Eof State: " << _myFileStream->eof() <<std::endl;
            std::cout << "Fail State: " << _myFileStream->fail() <<std::endl;
            std::cout << "Bad State: " << _myFileStream->bad() <<std::endl;
        }
        else
        {
            std::cout << "Opened log file" << std::endl;
        }
    }

    ~TestFileStream()
    {
        _myFileStream->close();
        delete _myFileStream;
        _myFileStream = nullptr;
    }

    void WriteFile( unsigned number )
    {
        if ( isFileOpen )
        {
            (*_myFileStream) << "Number: " << number << std::endl;
        }
    }       
};

int main() 
{
    // Number of iterations can be multiple.
    // For testing purpose, only 1 loop iteration executes
    for( unsigned iter = 1; iter != 2; ++iter )
    {
     TestFileStream fileWriteObj;
     fileWriteObj.WriteFile( 100+iter );
    } 

    return 0;
}

当我执行上面的代码时,我得到以下日志输出:

Unable to open log file
Good State: 0
Eof State: 0
Fail State: 1
Bad State: 0

这似乎是一项微不足道的任务,但我无法找出导致失败的原因。请注意,此问题很可能与以下question

相关

1 个答案:

答案 0 :(得分:0)

总结一下这些评论,你发布的代码没有任何问题(除了非常规的新ostream之外;)

但请注意,打开文件可能由于多种原因而失败(权限,正在使用的文件,磁盘不可用,文件不存在,文件存在...)。这就是为什么你必须经常测试它。

如果您尝试在在线模拟器中运行上述代码,则可能会禁用文件IO。这可以解释为什么你设置了流失败位。