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