我正在尝试将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;
}
答案 0 :(得分:4)
您的信息流在写入之前是否已打开?可能是从磁盘空间不足到权限不足的任何事情。
你也可能有错误:
ofstr << *buf;
应该是这样的:
ofstr << buf;
由于buf
是char*
,*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]
的行无法保证正常工作。也就是说,我怀疑你会找到一个不起作用的实现。不过,维持有保障的行为可能会更好。
答案 2 :(得分:2)
你需要在关闭之前冲洗ofstream。在ofstr.flush();
之前尝试ofstr.close();
我之前遇到此错误时,我认为关闭流会自动刷新它,但事实证明它没有。
答案 3 :(得分:1)
错误在行
ofstr&lt;&lt; * BUF;
应该是
ofstr&lt;&lt; BUF;
答案 4 :(得分:0)
您应该在创建后检查ofstream是否已开放供写作。