Array M. УЭИТ - Язык Си - руководство для начинающих
- Название:Язык Си - руководство для начинающих
- Автор:
- Жанр:
- Издательство:Мир
- Год:1988
- Город:Москва
- ISBN:5-03-001309-1 /русск./
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Array M. УЭИТ - Язык Си - руководство для начинающих краткое содержание
Язык Си — руководство для начинающих
Язык Си - руководство для начинающих - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
/* расскажите, что находится в файле "test" */
#include
main( )
{
FILE *in; /* описываю указатель на файл */
int ch;
if((in = fopen("test", "r"))!=NULL)
/* открываю test для чтения, проверяя существует ли он */
/* указатель FILE ссылается теперь на test */
{
while((ch = getc(in) != EOF) /* получаю символ из in */
putc(ch, stdout); /* посылаю на стандартный вывод */
fclose(in); /* закрываю файл */ }
else
printf("я не смогла открыть файл \" test\" .\n");
}
Следует объяснить три основных момента: работу fopen( ), работу fclose( ) и использование функций ввода-вывода файла. Займемся ими.
Открытие файла: fopen( )
Функцией fopen( )управляют три основных параметра. Первый - имя файла, который следует открыть. Он является и первым аргументом fopen( );в нашем случае это "test" .
Второй параметр [и второй аргумент fopen( )] описывает, как должен использоваться файл. Вот три основных применения файла:
"r": | файл нужно считать |
"w": | файл нужно записать |
"а": | файл нужно дополнить |
Некоторые системы предоставляют еще дополнительные возможности, но мы будем придерживаться этих. Заметим, что используемые нами коды являются строками, а нe символьными константами; следовательно, они заключаются в двойные кавычки. При применении " r" открывается существующий файл. При двух других применениях тоже будет открываться существующий файл, но если такого файла нет, он будет создан.
Внимание: Если вы используете "w"для существующего файла, то старая версия его стирается, и ваша программа начинает на "чистом месте".
Третий параметр является указателем на файл; это значение возвращается функцией:
FILE *in;
in = fopen("test", "r");
Теперь inявляется указателем на файл "test". С этого момента программа ссылается на файл при помощи указателя in, а не по имени test.
Если вы очень сообразительны, то теперь можете задать такой вопрос: "Если fopen( )возвращает указатель на 'FILE'в качестве аргумента, то почему мы не должны объявить fopen( )как функцию указателя на 'FILE'?" Хороший вопрос. Ответ заключается в том, что это описание сделал для нас файл stdio.h, который содержит строку
FILE *topen( );
Есть еще один важный момент относительно функции fopen(), которую мы использовали. Если fopen()не способна открыть требуемый файл, она возвращает значение 'NULL'(определенное в stdio.hкак 0). Почему она не смогла открыть файл? Вы можете попросить ее считать файл, который не существует. Вот почему мы имеем в программе строку
if((in=fopen("test", "r"))!= NULL)
Заполнение диска, использование запрещенного имени или некоторые другие причины могут препятствовать открытию файла. Поэтому побеспокойтесь, чтобы их не было - маленькая ошибка может увести вас очень далеко.
Закрыть файл проще.
Закрытие файла: fclose( )
Наш пример показывает, как закрывать файл:
fclose(in);
Просто используйте функцию fclose( ). Заметим, что аргументом ее является in, указатель на файл, а не test, имя файла.
Для программы, более серьезной, чем эта, следовало бы посмотреть, успешно ли закрыт файл. Функция fclose( )возвращает значение 0, если файл закрыт успешно, и -1в противном случае.
Текстовые файлы с буферизацией
Функции fopen()и fclose()работают с текстовыми файлами с "буферизацией". Под буферизацией мы понимаем, что вводимые и выводимые данные запоминаются во временной области памяти, называемой буфером. Если буфер заполнился, содержимое его передается в блок, и процесс буферизации начинается снова. Одна из основных задач fclose( )заключается в том, чтобы "освободить" любые частично заполненные буфера, если файл закрыт.
Текстовым считается файл, в котором информация запоминается в виде символов в коде ASCII (или аналогичном). Он отличается от двоичного файла, который обычно используется для запоминания кодов машинного языка. Функции ввода-вывода, о которых мы собираемся рассказать, предназначены только для работы с текстовыми файлами.
Ввод-вывод файла: getc( ) и putc( )
Две функции getc( )и putc( )работают аналогично функциям getchar( )и putchar( ). Разница заключается в том, что вы должны сообщить новичкам, какой файл следует использовать. Таким образом, наш "старый дружище"
ch = getchar( );
предназначен для получения символа от стандартного ввода, а
ch = getc(in);
- для получения символа от файла, на который указывает in. Аналогично функция
putc(ch, out);
предназначена для записи символа chв файл, на который ссылается указатель outтипа FILE. В списке аргументов функции putc( )этот символ стоит первым, а затем указатель файла. В нашем примере мы использовали
putc(ch, stdout);
где stdoutявляется указателем на стандартный вывод. Таким образом, этот оператор эквивалентен
putchar(ch);
Действительно, оператор putchar(ch)определен директивой #defineтак же как функция putc(ch, stdout)определена в файле stdio.h.Этот ужасный файл к тому же определяет в директиве #defineуказатели stdoutи stdinна стандартный вывод и стандартный ввод системы.
Это выглядит довольно просто? Хорошо, добавим пару полезных новшеств.
ПРОСТАЯ ПРОГРАММА СЖАТИЯ ФАЙЛА
В нашем примере имя файла, который следовало открыть, было записано в программе. Мы нс обязаны считаться с этим ограничением. Используя аргументы командной строки, можно сообщить нашей программе имя файла, который хотим считать. B нашем следующем примере (рис. 15.1) так и происходит. С помощью примитивного приема сжимается содержимое - остается только каждый третий символ. Наконец, сжатая версия размещается в новый файл, имя которого состоит из старого имени с добавкой .red (сокращение слова reduced). Обычно весьма важны первый и последний элементы (аргумент командной строки и добавка к имени файла). Само же сжатие имеет более ограниченное применение, но, как вы увидите, им можно пользоваться.
/* сожмите ваши файлы в 2-3 раза! */
#include
main(argc, argv)
int argc;
char *argv[ ];
{
FILE *in, *out; /* описывает два указателя типа FILE */
int ch;
static char name[20]; /* память для имени выходного файла */
int count = 0;
if(argc < 2) /* проверяет, есть ли входной файл */
printf(" Извините, мне нужно имя файла в качестве аргумента.\n" );
else
{ if((in = fopen(argv[1], "r")) != NULL)
{
strcpy(name, argv[1]; /* копирует имя файла в массив */
Читать дальшеИнтервал:
Закладка: