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