почему std :: wofstream не печатает все wstring в файл?

у меня есть std::wstring чей размер составляет 139 580 199 символов.

Для отладки я распечатал его в файл с таким кодом:

std::wofstream f(L"C:\\some file.txt");
f << buffer;
f.close();

После этого заметил, что конец строки отсутствует. Размер создаваемого файла составляет 109 592 584 байта (а «размер на диске» — 109 596 672 байта).

Также проверил, если буфер содержит нулевые символы, сделал это:

size_t pos = buffer.find(L'\0');

Ожидаемый результат будет std::wstring::npos но это 18446744073709551615, но моя строка не имеет нулевого символа в конце, так что, вероятно, все в порядке.

Может кто-нибудь объяснить, почему у меня не все строки напечатаны в файл?

3

Решение

Многое зависит от локали, но обычно файлы на диске
не использовать ту же форму кодирования (или даже ту же кодировку), что и
что используется wchar_t; filebuf который делает фактический
чтение и запись переводит кодировки в соответствии с его
пропитан языком. И есть только смутные отношения между
длина строки в разных кодировках или в форме кодирования.
(И размер, который видит система, не соответствует напрямую
количество байтов, которые вы можете прочитать из файла.)

Чтобы увидеть, все ли было написано, проверьте статус f
после конец, т.е.

f.close();
if ( !f ) {
//  Something went wrong...
}

Одна вещь, которая может пойти не так, это то, что внешнее кодирование
не имеет представления для одного из персонажей. Если
ты в "C" локаль, это может произойти для любого персонажа
вне основного набора символов выполнения.

Если выше нет ошибки, нет никаких оснований предполагать, что
что не вся строка была написана. Что будет, если
Вы пытаетесь прочитать это в другой программе? Вы получаете то же самое
количество символов или нет?

В остальном, нуль-символы — это символы, подобные любым другим в
std::wstring; в них нет ничего особенного, в том числе
когда они выводятся в поток. А 18446744073709551615
выглядит очень похоже на значение, которое я ожидал бы для
std::wstring::npos на 64-битной машине.

РЕДАКТИРОВАТЬ:

В продолжение комментария Мэтта Петерссона: это на самом деле очень
маловероятно, что файл будет содержать меньше байтов, чем есть
кодовые точки в std::wstring, (std::wstring::size()
возвращает количество кодов.) Я думал с точки зрения
байты, а не с точки зрения того, что std::wstring::size() возвращается. Так
наиболее вероятным объяснением является то, что у вас есть некоторые символы в
ваша строка, которая не может быть представлена ​​в целевой кодировке
(который, вероятно, поддерживает только символы с кодовыми точками
32-126, плюс несколько управляющих символов, по умолчанию).

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]