[英]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;
由于buf
是char*
,因此*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.