【问题标题】:std::ofstream : Writing to a file using append and out flagsstd::ofstream :使用附加和输出标志写入文件
【发布时间】:2014-07-14 13:55:54
【问题描述】:

下面是一个尝试将整数写入文件的简单类。写入文件的模式是在文件末尾追加字符(这种模式下文件不存在就创建)

#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有关

【问题讨论】:

  • 你为什么使用new(无关)?你在当前目录的权限是什么?
  • 为我工作。可能是关于权限吗?
  • 我的实际代码太大,无法在此处重现。 ,所以我在 ideone.com 上写了这个例子。也许与 ideone 上的文件写入权限有关。在我的实际代码中,我有 appx 50K 循环迭代。而且我每次循环迭代都会记录大量数据。该文件已创建并且确实被写入,但仅针对某些迭代..say 550 ...但对于剩余的迭代,我的代码一直显示错误“无法打开日志文件”。我不知道为什么会这样。
  • 无需动态分配流,或使用 out 标志(ofstream 默认为 out),也无需在删除前关闭文件 - 它会自动发生。请注意,将 endl intead of "\n" 写入文件会更慢。
  • @NeilKirk:是的,我知道冗余输出标志并且不需要堆分配。相反,我的 TestFileStream 对象应该在堆上创建。我不知道文件关闭部分(谢谢)。我写 endl 只是为了刷新流。

标签: c++ stl ofstream


【解决方案1】:

只是总结一下 cmets,您发布的代码没有任何问题(除了相当非常规的新 ostream ;))

但是请注意,打开文件可能会因多种原因而失败(权限、文件正在使用、磁盘不可用、文件不存在、文件存在...)。这就是为什么您必须始终对其进行测试。

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

【讨论】:

  • 实际上我在循环中执行以下操作序列(50K 次):“打开文件,向其附加一些数据并关闭文件”。可能反复打开和关闭文件会导致 FAIL 状态在大约 500 次迭代后获取状态的问题。相反,我认为我应该在进入循环之前打开文件,在循环内我应该将数据附加到文件中,最后我应该在循环外关闭文件。也许这可以解决问题。
  • 不管它是否解决了问题,你应该一定要这样做。 :)
猜你喜欢
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多