繁体   English   中英

ofstream不会将缓冲区写入文件

[英]ofstream doesn't write buffer to file

我正在尝试将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;
}

在写之前是否打开了流? 可能是从磁盘空间不足到权限不足之类的任何东西。

另外,您可能会遇到错误:

ofstr << *buf;

应该是这样的:

ofstr << buf;

由于bufchar* ,因此*buf给出char ,而不是char*

这是使用std::string代替原始缓冲区/指针的地方;)

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

永远不要在代码中使用new 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]的行正常工作。 就是说,我怀疑您会发现无法实现的实现。 尽管如此,维护有保证的行为还是可以说更好。

我确实怀疑 问题出在您取消引用指针了。

您需要先关闭ofstream,然后再关闭它。 试试ofstr.flush(); ofstr.close();之前ofstr.close(); 前段时间我遇到了这个错误,当时我以为关闭流会自动将其刷新,但事实证明并非如此。

错误在行

ofstr << * buf;

它应该是

ofstr << buf;

创建后,应检查ofstream是否已打开以进行写入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM