написание оболочки для fwprintf - PullRequest
0 голосов
/ 08 августа 2011

Я пытаюсь написать оболочку для fwprintf.Я использую wstringstream для захвата отформатированного va_list, а затем использую фактический fwprintf для печати в файл.Почему-то вместо хорошей строки в юникоде я получаю искаженные цифры.

Может кто-нибудь помочь?

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 ]

2 голосов
/ 08 августа 2011

Вы выводите целые числа в поток, и вы озадачены тем, что после этого поток содержит (десятичные спецификации) целых чисел.

Учтите, что ваш код

buffer << vwprintf(message, args);

эквивалентно

int const x = vwprintf(message, args);
buffer << x;

Возможно, теперь вы видите, как вы получаете свои реальные результаты?

Приветствия и hth.,

1 голос
/ 08 августа 2011

То, что вы делаете, как правило, ужасно (гораздо лучше, например, выставить выходной поток журналирования или любое количество средств журналирования Boost), но если вам действительно нужно пройти через это, давайте посмотрим, как это исправить,Прежде всего, vwprintf печатает на стандартный вывод, а не на строку, поэтому, прежде всего, прочитайте документацию по вашим основным функциям строительного блока.Ближайшая вещь к чему-то полезному будет vswprintf, которая печатает в широкую строку.Нам все еще нужно наложить произвольный предел размера:

wchar_t buf printbuf[1024];
vswprintf(printbuf, 1024, message, args);

buffer << std::wstring(buffer);

Вам все равно придется добавить какую-то обработку ошибок в случае, если ваш буфер слишком короткий.

...