В настоящий момент я дважды читаю один и тот же файл, потому что мне нужны два разных представления: (а) необработанная последовательность байтов без какого-либо преобразования, (б) текстовое представление с байтами, конвертируемыми в текущий набор символов выполнения. По сути, код выглядит так:
using namespace std;
const char* fileName = "test.txt";
// Part 1: Read the file unmodified byte-per-byte
string binContent;
ifstream file1( fileName, ifstream::binary );
while( true ) {
char c;
file1.get( c );
if( !file1.good() ) break;
binContent.push_back( c );
}
// Part 2: Read the file and convert the character code according to the
// current locale from external character set to execution character set
wstring textContent;
wifstream file2( fileName );
wifstream.imbue( locale("") );
while( true ) {
wchar_t c;
file2 >> c;
if( !file2.good() ) break;
textContent.push_back( c );
}
Очевидно, код читает один и тот же файл дважды. Я хотел бы избежать этого и напрямую конвертировать binaryContent
в textContent
в памяти.
Обратите внимание, что это больше, чем просто char
в wchar_t
преобразование, потому что оно также может включать в себя истинное преобразование символов, если кодировка символов текущей локали locale("")
отличается от исполнения кодировки символов. Такое преобразование может быть необходимым, даже если textContent
тоже была узкая строка символов.
В приведенном выше примере магия преобразования персонажей в части 2 происходит в template<typename _CharT, typename _Traits> bool basic_filebuf<_CharT, _Traits >::_M_convert_to_external( _CharT* __ibuf, streamsize __ilen )
в fstream.tcc
и включает в себя использование codecvt
аспект локали.
Я надеялся на способ построить wistringstream
объект из binContent
объект вместо wifsteam
а затем пропитывая wistringstream
с правильным языком. Но это, похоже, не работает, потому что все конструкторы wistringstream
уже ожидают широкого характера, и при этом wistringstream
кажется, реализовать логику преобразования wifstream
,
Есть ли лучший способ (то есть более краткий и менее подверженный ошибкам), чем использование codecvt
вручную?
Задача ещё не решена.