РИС. 15.1. Программа сжатия файла.
Мы поместили программу в файл, названный reduce и применили эту программу к файлу, названному eddy, который содержал одну единственную строку
Была выполнена команда
и на выходе получен файл, названный eddy.red
, который содержитКакая удача! Наш случайно выбранный файл сделал осмысленное сокращение.
Вот некоторые замечания по программе.
Вспомните, что argc
содержит определенное количество аргументов, в число которых входит имя программного файла. Вспомните также, что с согласия операционной системы argv[0] представляет имя программы, т. е. в нашем случае reduce. Вспомните еще, что argv[l] представляет первый аргумент, в нашем случае eddy. Так как сам argv[l] является указателем на строку, он не должен заключаться в двойные кавычки в операторе вызова функции.Мы используем argc
, чтобы посмотреть, есть ли аргумент. Любые избыточные аргументы игнорируются. Помещая в программу еще один цикл, вы могли бы использовать дополнительные аргументы - имена файлов и пропускать в цикле каждый из этих файлов по очереди.С целью создания нового имени выходного файла мы используем функцию strcpy( )
для копирования имени eddy в массив nаmе. Затем применяем функцию strcat( ) для объединения этого имени с .red.Программа требует, чтобы два файла были открыты одновременно, поэтому мы описали два указателя типа 'FILE '
. Заметим, что каждый файл должен открываться и закрываться независимо от другого. Существует ограничение на количество файлов, которые вы можете держать открытыми одновременно. Оно зависит от типа системы, но чаще всего находится в пределах от 10 до 20. Можно использовать один и тот же указатель для различных файлов при условии, что они нс открываются в одно и то же время.Мы не ограничиваемся использованием только функций getc( )
и putc( ) для файлов ввода-вывода. Далее мы рассмотрим некоторые другие возможности.ВВОД-ВЫВОД ФАЙЛА: fprintf( ), fscanf( ), fgets( ) И fputs( )
Все функции ввода-вывода, которые мы использовали в предыдущих главах, имеют аналоги для ввода-вывода файла. Основное отличие состоит в том, что вам нужно использовать указатель типа FILE
, чтобы сообщить новым функциям, с каким файлом им следует работать. Подобно getc( ) и putc( ) эти функции используются после функции fopen( ), открывающей файл, и перед fclose( ), закрывающей его.Функции fprintf( ) и fscanf( )
Эти функции ввода-вывода работают почти как printf( )
и scanf( ), но им нужен дополнительный аргумент для ссылки на сам файл. Он является первым в списке аргументов. Вот пример, иллюстрирующий обращение к этим функциям:Заметим, что можно было использовать fi
для двух различных файлов, потому что мы закрыли первый файл, прежде чем открыть второй.В отличие от getc( )
и putc( ) эти две функции получают указатель типа FILE в качестве первого аргумента. Две другие, описанные ниже, получают его в качестве последнего аргумента.Функция fgets( )
Эта функция имеет три аргумента, в то время как gets( )
имеет один. Вот пример ее использования:Первый из трех аргументов функции fgets( )
является указателем на местоположение считываемой строки. Мы располагаем вводимую информацию в символьный массив string.