为fwprintf写一个包装器

时间:2011-08-08 14:24:19

标签: c++ unicode stringstream printf

我正在尝试为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);
}

2 个答案:

答案 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);

如果您的缓冲区太短,您仍然需要添加某种错误处理。