Например, в файлах Macintosh до выхода OS X для указания новой строки применялся символ \г (возврат каретки). В файлах из ранних версий MS-DOS для обозначения повой строки использовалась комбинация \г\n, а для признака конца файла — встраиваемый символ , несмотря на то, что действительный файл может быть дополнен нулевыми символами, чтобы сделать общий размер кратным 256. (В среде Windows редактор “Блокнот” по-прежнему создает текстовые файлы в формате MS-DOS, но более новые редакторы могут применять формат, близкий к Unix- подобному.) Другие системы могут делать все строки в текстовом файле одинаковой длины, дополняя их при необходимости нулевыми символами до нужной длины. Или же система может кодировать длину каждой строки в ее начале.
Чтобы привнести некоторую закономерность в обработку текстовых файлов, язык С предоставляет два способа доступа в файл: двоичный режим и текстовый режим. В двоичном режиме программе доступен каждый байт файла. Однако в текстовом режиме то, что видит программа, может отличаться от того, что хранится в файле. В текстовом режиме при чтении файла представление локальной среды для таких символов, как конец строки или конец файла, сопоставляется с их представлением в С.
Аналогично, представление в С отображается на локальное представление вывода. Например, программа С, скомпилированная в старой среде Macintosh, будет преобразовывать \г в \n при чтении файла в текстовом режиме и \n в \г при записи в файл. Программа С текстового режима, скомпилированная на платформе MS-DOS, будет преобразовывать \г\n в \n при чтении из файла и \n в \г\n при записи в файл. Программы текстового режима, написанные для других сред, предпринимают похожие корректировки.
При работе с текстовым файлом вы не ограничены только текстовым представлением. Для того же самого файла можно использовать и двоичное представление. Если вы поступите подобным образом для старого текстового файла MS-DOS, то программа будет видеть в файле символы \г и \n; никакого сопоставления не происходит. (Сказанное иллюстрируется на рис. 13.1.) Если вы хотите написать программу просмотра текста, которая работает, скажем, со старыми форматами Macintosh, MS-DOS и Unix/Linux, то могли бы применять двоичный режим, чтобы программа выясняла фактическое содержимое файла и предпринимала соответствующие действия.
Несмотря на то что в С доступны двоичное и текстовое представления, они могут быть реализованы идентично. Как упоминалось ранее, поскольку в Unix применяется всего одна файловая структура, в реализациях для Unix оба представления одинаковы. То же самое справедливо для Linux.

Глава 13
Уровни ввода-вывода
В дополнение к выбору представления файла в большинстве случаев вы можете выбирать один из двух уровней ввода-вывода (т.е. из двух уровней управления доступом к файлам). Низкоуровневый ввод-вывод предусматривает использование основных служб ввода-вывода, предоставляемых операционной системой. Стандартный высокоуровневый ввод-вывод предполагает применение стандартного пакета библиотечных функций С и определений из заголовочного файла stdio.h. Стандарт С поддерживает только стандартный пакет ввода-вывода, т.к. нет никакой возможности гарантировать, что все операционные системы могут быть представлены одинаковой низкоуровневой моделью ввода-вывода. Отдельные реализации могут также предлагать низкоуровневые библиотеки, но из-за того, что стандарт С устанавливает переносимую модель ввода- вывода, мы сосредоточим все внимание на ней.
Стандартные файлы
Программы на С автоматически открывают три файла, которые называются стандартным вводом, стандартным выводом и стандартным выводом ошибок. По умолчанию стандартный ввод представляет собой обычное устройство ввода в вашей системе, как правило, клавиатуру. Стандартный вывод и стандартный вывод ошибок по умолчанию являются обычным устройством вывода вашей системы, т.е. экраном монитора.
Естественно, стандартный ввод обеспечивает ввод данных в программу. Это файл, который читается с помощью функций getchar() и scanf(). Стандартный вывод - место, куда направляется обычный вывод программы. Он используется функциями putchar(), puts() и printf(). Перенаправление, как вы уже знаете из главы 8, приводит к тому, что другие файлы опознаются как стандартный ввод и стандартный вывод. Назначение файла стандартного вывода ошибок заключается в том, чтобы предоставить логически обособленное место для отправки сообщений об ошибках.
Читать дальше