Как получить числа, чтобы прекратить использовать разделители группировки в библиотеке std :: wfstream? - PullRequest
0 голосов
/ 16 ноября 2018

Я использовал библиотеку std :: fstream и обнаружил, что она не может писать.Оказывается, это был mdash.

wchar_t mdash[] = { 0x2014, 0x0000 };

std::wfstream os("filename.txt", std::ios_base::out| std::ios_base::trunc);
os << mdash;
assert(!os.bad()); // fails

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

void set_locale_on_stream(std::wfstream &os)
{
    char* locale = setlocale(LC_ALL, "English"); // Get the CRT's current locale.
    std::locale lollocale(locale);
    setlocale(LC_ALL, locale); // Restore the CRT.
    os.imbue(lollocale); // Now set the std::wcout to have the locale that we got from the CRT.
}

Это сработало, за исключением того, что теперь у меня есть числа, в которые добавляются разделители групп, и они шестнадцатеричные, что делает егосовершенно бесполезно!

Есть ли способ остановить это?

1 Ответ

0 голосов
/ 16 ноября 2018

fs.imbue(std::locale(ofs.getloc(), new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>)) необходим для установки локали, к сожалению, codecvt_utf16 устарел и пока не имеет замены.

Вместо этого вы можете открыть файл в двоичном режиме и использовать pubsetbuf. Обратите внимание: если в вашем файле нет 2-байтового маркера спецификации в начале, текстовый редактор может не распознать его как UTF16-LE.

int foo()
{
    wchar_t mdash[] = L"— ? Test";
    const wchar_t *filename = L"filename.txt";

    wchar_t wbuf[128];
    std::wofstream fout(filename, std::ios::binary);
    if(fout)
    {
        fout.rdbuf()->pubsetbuf(wbuf, 128);

        //optional BOM
        wchar_t bom[1] = { 0xFEFF };
        fout.write(bom, 1);

        fout << mdash;
        fout.close();
    }

    std::wifstream fin(filename, std::ios::binary);
    if(fin)
    {
        fin.rdbuf()->pubsetbuf(wbuf, 128);

        //optional, skip BOM
        std::wstring wstr;
        if(fin >> wstr)
            MessageBoxW(0, wstr.c_str(), 0, 0);
        fin.close();
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...