1

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

5 回答 5

4

你的流在写之前打开了吗?可能是从磁盘空间不足到权限不足的任何情况。

你也可能有一个错误:

ofstr << *buf;

应该是这样的:

ofstr << buf;

由于bufis a char**buf给出 a char,而不是 a char*

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

于 2010-07-19T09:21:32.893 回答
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
}

更容易阅读和维护。注意更好的是a std::string buf(n + 1);,那么你可以这样做ofstr << buf;。可悲的是,std::string目前不需要连续存储其元素,例如std::vector. 这意味着&buf[0]不保证该行正常工作。也就是说,我怀疑你会找到一个不起作用的实现。尽管如此,可以说保持有保证的行为更好。

不过,我确实怀疑问题是您取消了对指针的引用。

于 2010-07-19T10:39:56.317 回答
1

错误在行

ofstr << *buf;

它应该是

ofstr << buf;

于 2010-07-19T09:25:53.793 回答
1

您需要在关闭它之前刷新 ofstream。在前段时间我遇到这个错误ofstr.flush();之前尝试一下,当时我认为关闭流会自动刷新它,但事实证明,它没有。ofstr.close();

于 2010-07-19T09:31:14.803 回答
0

您应该检查 ofstream 在创建后是否已打开以供写入。

于 2010-07-19T09:20:16.077 回答