Текстовые и двоичные потоки
Текстовый поток состоит из одной или нескольких строк текста, которые можно вывести на ориентированный на текст дисплей, чтобы их можно было прочитать. При чтении из текстового потока программа считывает новую строку в конце каждой строки. При записи в текстовый поток программа записывает новую строку, чтобы сигнализировать о конце строки. Для сопоставления различных соглашений о представлении текста в файлах в различных целевых средах библиотечные функции могут изменять количество и представление символов, передаваемых между программой и текстовым потоком.
Размещение в текстовом потоке ограничено. Вы можете получить текущий индикатор положения файла, вызвав fgetpos
или ftell
. Вы можете разместить текстовый поток в позиции, полученной таким образом, или в начале или конце потока, вызвав fsetpos
или fseek
. Любое другое изменение позиции может не поддерживаться.
Для максимальной переносимости программа не должна записывать:
- Пустые файлы.
- Пробельные символы в конце строки.
- Частичные строки (пропуская новую строку в конце файла).
- Символы, отличные от печатных символов, новой линии и горизонтальной вкладки.
Если следовать этим правилам, последовательность символов, которые вы читаете из текстового потока, будет соответствовать последовательности записанных символов, будь то байты или многобайтовые символы. В противном случае библиотечные функции могут удалить создаваемый файл, если в момент закрытия он был пуст. Кроме того, они могут изменять или удалять символы, записываемые в файл.
Двоичный поток состоит из одного или нескольких байтов произвольных данных. Можно записать значение, хранящееся в произвольном объекте, в двоичный (ориентированный на байты) поток и считать в точности те данные, которые хранились в объекте при его записи. Функции библиотеки не изменяют байты, передаваемые между программой и двоичным потоком. Однако они могут добавить произвольное число байтов NULL
в файл, который вы записываете с помощью двоичного потока. Программа должна иметь дело с этими дополнительными NULL
байтами в конце двоичного потока.
Расположение в двоичном потоке хорошо определено, за исключением расположения относительно конца потока. Можно получить и изменить текущий индикатор позиции в файле тем же образом, что и для текстового потока. Смещения, используемые ftell
и fseek
числом байтов от начала потока (то есть байт нуля), поэтому целочисленное арифметическое для этих смещения дает прогнозируемые результаты.
Байтовый поток обрабатывает файл как последовательность байтов. В рамках программы поток выглядит как та же последовательность байтов, за исключением возможных изменений, описанных выше.