其他分享
首页 > 其他分享> > c-ofstream不会将缓冲区写入文件

c-ofstream不会将缓冲区写入文件

作者:互联网

我正在尝试将buf指针的内容写入由ofstream创建的文件.

由于某种原因,文件为空,但是buf的内容永远不会为空…我在做什么错?

void DLog::Log(const char *fmt, ...)
{
    va_list varptr;

    va_start(varptr, fmt);

    int n = ::_vscprintf(fmt, varptr);
    char *buf = new char[n + 1];
    ::vsprintf(buf, fmt, varptr);

    va_end(varptr);

    if (!m_filename.empty())
    {

        std::ofstream ofstr(m_filename.c_str(), ios::out);

        ofstr << *buf; // contents of *buf are NEVER empty, however nothing is in file??

        ofstr.close();
    }


    delete [] buf;
}

解决方法:

摆脱繁琐的工作可以解决许多问题,例如手动分配管理.

切勿在代码中使用新的T [N]:而是使用std :: vector< T> V(N);.仅仅这一个就可以解决您的问题,因为指针的内容不会妨碍您:

void DLog::Log(const char *fmt, ...)
{
    va_list varptr;
    va_start(varptr, fmt);

    int n = ::_vscprintf(fmt, varptr);
    std::vector<char> buf(n + 1);

    ::vsprintf(&buf[0], fmt, varptr);

    va_end(varptr);

    if (!m_filename.empty())
    {
        std::ofstream ofstr(m_filename.c_str(), ios::out);
        if (!ofstr) 
        {
            // didn't open, do some error reporting here
        }

        // copy each character to the stream
        std::copy(buf.begin(), buf.end(), std::ostream_iterator<char>(ofstr));

        // no need to close, it's done automatically
    }

    // no need to remember to delete
}

更容易阅读和维护.请注意,最好是std :: string buf(n 1);,然后可以执行ofstr<< BUF ;.可悲的是,当前不需要std :: string连续存储其元素,例如std :: vector.这意味着不能保证带有& buf [0]的行.就是说,我怀疑您会发现无法实现的实现.尽管如此,维护有保证的行为还是可以说更好. 我是suspect,但issue是您取消引用指针的地方.

标签:ofstream,c
来源: https://codeday.me/bug/20191012/1901306.html