Чтение онлайн

ЖАНРЫ

Язык Си - руководство для начинающих

Д. МАРТИН

Шрифт:

if(argc < 2) /* проверяет, есть ли входной файл */

printf(" Извините, мне нужно имя файла в качестве аргумента.\n" );

else

{ if((in = fopen(argv[1], "r")) != NULL)

{

strcpy(name, argv[1]; /* копирует имя файла в массив */

strcat(name, ".red"); /* добавляет .red к имени */

out = fopen(name, "w"); /* открывает файл для записи */

while((ch = getc(in)) ! = EOF)

if( count ++ %3 ==0)

putc(ch, out); /*

печатает каждый третий символ */

fclose(in);

fclosе(out); }

else

printf(" Я не смогла открыть файл\" %s\" .\n", argv[1]);

} }

РИС. 15.1. Программа сжатия файла.

Мы поместили программу в файл, названный reduce и применили эту программу к файлу, названному eddy, который содержал одну единственную строку

Даже Эдди нас опередил с детским хором.

Была выполнена команда

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, но им нужен дополнительный аргумент для ссылки на сам файл. Он является первым в списке аргументов. Вот пример, иллюстрирующий обращение к этим функциям:

/* образец использования fprintf и fscanf */

#include <stdio.h>

main

{

FILE *fi;

int age;

fi = fopen("sam", "r"); /* считывание */

fscanf(fi, "%d", &age); /* fi указывает на sam */

fclose(fi);

fi = fopen("data", "a"); /* дополнение "/

fprintf(fi, "sam is %d. \n", age); /* fi указывает на data */

fclose(fi);

}

Заметим, что можно было использовать fi для двух различных файлов, потому что мы закрыли первый файл, прежде чем открыть второй.

В отличие от getc и putc эти две функции получают указатель типа FILE в качестве первого аргумента. Две другие, описанные ниже, получают его в качестве последнего аргумента.

Функция fgets

Эта функция имеет три аргумента, в то время как gets имеет один. Вот пример ее использования:

/* считывает файл строка за строкой */

#include <stdio.h>

#define MAXLIN 80

main

{

FILE *f1;

char *string [MAXLIN];

f1 = fopen("story", "r");

while(fgets(string, MAXLIN, f1) != NULL)

puts(string);

}

Первый из трех аргументов функции fgets является указателем на местоположение считываемой строки. Мы располагаем вводимую информацию в символьный массив string.

Второй аргумент содержит предельную длину считываемой строки. Функция прекращает работу после считывания символа новой строки или после считывания символов общим числом MAXLIN - 1 (в зависимости от того, что произойдет раньше). В любом случае нуль-символ ('\0') добавляется в самый конец строки.

Поделиться с друзьями: