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