ofstream不会将缓冲区写入文件

时间:2010-07-19 09:14:38

标签: 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;
}

5 个答案:

答案 0 :(得分:4)

您的信息流在写入之前是否已打开?可能是从磁盘空间不足到权限不足的任何事情。

你也可能有错误:

ofstr << *buf;

应该是这样的:

ofstr << buf;

由于bufchar**buf会提供char,而不是char*

这是使用std::string而不是原始缓冲区/指针有意义的地方;)

答案 1 :(得分:3)

许多问题可以通过摆脱毛茸茸的东西来解决,比如手动分配管理。

切勿在代码中使用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]的行无法保证正常工作。也就是说,我怀疑你会找到一个不起作用的实现。不过,维持有保障的行为可能会更好。

我做suspect issue你是否取消引用指针。

答案 2 :(得分:2)

你需要在关闭之前冲洗ofstream。在ofstr.flush();之前尝试ofstr.close();我之前遇到此错误时,我认为关闭流会自动刷新它,但事实证明它没有。

答案 3 :(得分:1)

错误在行

ofstr&lt;&lt; * BUF;

应该是

ofstr&lt;&lt; BUF;

答案 4 :(得分:0)

您应该在创建后检查ofstream是否已开放供写作。