ОБНОВЛЕНИЕ: Спасибо @Potatoswatter и @Jonathan Leffler за комментарии - довольно смущающе, я был пойман подсказкой отладчика, не показывающей значение wstring правильно - однако это все еще не совсем работает для меня, и я имею обновил вопрос ниже:
Если у меня небольшой многобайтовый файл, который я хочу прочитать в строку, я использую следующий прием - я использую getline
с разделителем '\0'
, например,
std::string contents_utf8;
std::ifstream inf1("utf8.txt");
getline(inf1, contents_utf8, '\0');
Это читает весь файл, включая переводы строки.
Однако, если я пытаюсь сделать то же самое с файлом широких символов, это не сработает - мой wstring
читает только до первой строки.
std::wstring contents_wide;
std::wifstream inf2(L"ucs2-be.txt");
getline( inf2, contents_wide, wchar_t(0) ); //doesn't work
Например, файл my if unicode содержит символы A и B, разделенные CRLF, гекс выглядит следующим образом:
FE FF 00 41 00 0D 00 0A 00 42
Основываясь на том факте, что с многобайтовым файлом getline с '\ 0' читает весь файл, я полагал, что getline( inf2, contents_wide, wchar_t(0) )
следует читать во всем файле Unicode. Однако это не так - в приведенном выше примере моя широкая строка будет содержать следующие два wchar_ts: FF FF
(Если я удаляю wchar_t (0), он читается в первой строке, как и ожидалось (т.е. FE FF 00 41 00 0D 00
)
Почему wchar_t (0) не работает как разделитель wchar_t, так что getline останавливается на 00 00
(или читает до конца файла, что я и хочу)?
Спасибо