Поделиться через


Байтовые и широкие потоки

Байтовый поток обрабатывает файл как последовательность байтов. В рамках программы поток передает эту последовательность байтов в неизменном виде.

Широкий поток, в свою очередь, представляет файл как последовательность обобщенных символов в многобайтовой кодировке, для которых могут использоваться различные наборы правил кодирования. (Текстовые и двоичные файлы по-прежнему считываются и записываются, как описано ранее.) В программе поток выглядит как соответствующая последовательность широких символов. Преобразования между двумя представлениями выполняются в стандартной библиотеке C. Правила преобразования, в принципе, могут быть изменены вызовом setlocale , который изменяет категорию LC_CTYPE. Каждый широкий поток определяет правила преобразования в то время, когда он становится широко ориентированным, и сохраняет эти правила, даже если категория LC_CTYPE позже изменяется.

Размещение в широком потоке имеет те же ограничения, что и для текстовых потоков. Более того, индикатор положения в файле часто должен учитывать кодировку, зависящую от состояния. Как правило, он содержит как байтовое смещение в пределах потока, так и объект типа mbstate_t. Таким образом, единственным надежным способом получения положения файла в широком потоке является вызов fgetpos, и единственным надежным способом восстановления позиции, полученной таким образом, является вызов fsetpos.

См. также

Файлы и потоки
setlocale, _wsetlocale