Некоторые символы Юникода приводят к преждевременному сбою CStdioFile EOF. ⇐ C++
-
Anonymous
Некоторые символы Юникода приводят к преждевременному сбою CStdioFile EOF.
Для файла UTF-16LE:
お客様番号: 123456789
Тот же просмотренный гексагон:
FF FE 4A 30 A2 5B D8 69 6A 75 F7 53 1A FF 20 00 BOM お 客 様 番 号 : космос 31 00 32 00 33 00 34 00 35 00 36 00 37 00 38 00 1 2 3 4 5 6 7 8 ... и т. д. И этот механизм чтения C++ MFC
CStdioFile cInFile; cInFile.Open("sample.txt", CFile::modeRead); БАЙТ lineOfFile[4096]; DWORD dwRead = cInFile.Read(lineOfFile, sizeof lineOfFile); [*]dwRead будет равно 12 (вместо ожидаемых 34). [*]И Read вызовет EOF. Это означает, что операция чтения прекратит чтение перед символом «:», как если бы она достигла конца файла. Любая дальнейшая попытка чтения этого потока вернет ноль.
По всей видимости, причиной является символ ":", который является полноширинным двоеточием. Значение Unicode и UTF-16LE: 0xFF1A. https://www.compart.com/en/unicode/U+FF1A
Я подозреваю, что «FF» вызывает что-то глубокое.
Но если я использую тип CFile вместо CStdioFile, он работает нормально.
Я не знаю, как предвидеть ошибку и выбрать лучший тип (поскольку в большинстве случаев мне нужен CStdioFile для управления сетевым чтением).
Для файла UTF-16LE:
お客様番号: 123456789
Тот же просмотренный гексагон:
FF FE 4A 30 A2 5B D8 69 6A 75 F7 53 1A FF 20 00 BOM お 客 様 番 号 : космос 31 00 32 00 33 00 34 00 35 00 36 00 37 00 38 00 1 2 3 4 5 6 7 8 ... и т. д. И этот механизм чтения C++ MFC
CStdioFile cInFile; cInFile.Open("sample.txt", CFile::modeRead); БАЙТ lineOfFile[4096]; DWORD dwRead = cInFile.Read(lineOfFile, sizeof lineOfFile); [*]dwRead будет равно 12 (вместо ожидаемых 34). [*]И Read вызовет EOF. Это означает, что операция чтения прекратит чтение перед символом «:», как если бы она достигла конца файла. Любая дальнейшая попытка чтения этого потока вернет ноль.
По всей видимости, причиной является символ ":", который является полноширинным двоеточием. Значение Unicode и UTF-16LE: 0xFF1A. https://www.compart.com/en/unicode/U+FF1A
Я подозреваю, что «FF» вызывает что-то глубокое.
Но если я использую тип CFile вместо CStdioFile, он работает нормально.
Я не знаю, как предвидеть ошибку и выбрать лучший тип (поскольку в большинстве случаев мне нужен CStdioFile для управления сетевым чтением).
Мобильная версия