我正在尝试为fwprintf
编写一个包装器。我正在使用wstringstream
捕获格式化的va_list
,然后使用实际的fwprintf
打印到文件。出于某种原因,我没有使用漂亮的unicode字符串,而是出现乱码。
有人可以帮忙吗?
void WriteToLog(wchar_t *message, ...)
{
FILE * pFile;
if (_wfopen_s (&pFile, SZ_LOG_FILE_PATH,L"a") != 0)
{
display_error_message(-1, L"Could not open log file.", IsSilent, MB_ICONSTOP);
return;
}
std::wstringstream buffer;
va_list args;
va_start(args, message);
buffer << vwprintf(message, args);
va_end(args);
fwprintf(pFile, buffer.str().c_str());
fclose(pFile);
}
答案 0 :(得分:2)
您正在向流输出整数,然后您感到困惑,之后流包含(十进制规格)整数。
考虑一下你的代码
buffer << vwprintf(message, args);
相当于
int const x = vwprintf(message, args);
buffer << x;
您现在可能已经看到了如何获得实际结果吗?
干杯&amp;第h。,
答案 1 :(得分:1)
你正在做的事情通常很糟糕(例如暴露日志输出流或任何数量的Boost日志记录设施会好得多),但如果你真的必须经历它,那么让我们看看如何解决这个问题。首先,vwprintf
打印到标准输出,而不是字符串,所以首先要读取基本构建块函数的文档。最有用的东西是vswprintf
,它打印成一个宽字符串。我们仍然需要施加任意大小限制:
wchar_t buf printbuf[1024];
vswprintf(printbuf, 1024, message, args);
buffer << std::wstring(buffer);
如果您的缓冲区太短,您仍然需要添加某种错误处理。