ОБНОВЛЕНИЕ: спасибо @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
Например, если мой файл 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
(или читается до конца файла, чего я и хочу)?
Спасибо.
\0
s? - person Potatoswatter   schedule 28.04.2010