Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Основы программирования на Си.doc
Скачиваний:
361
Добавлен:
02.05.2014
Размер:
1.3 Mб
Скачать

Текстовые файлы с буферизацией

Функции fopen( ) и fclose( ) работают с текстовыми файлами с "буферизацией". Под буферизацией мы понимаем, что вводимые и выводимые данные запоминаются во временной области памяти, называемой буфером. Если буфер заполнился, содержимое его передается в блок, и процесс буферизации начинается снова. Одна из основных задач fclose( ) заключается в том, чтобы освободить любые частично заполненные буферы, если файл закрыт. Текстовым считается файл, в котором информация запоминается в виде символов в коде ASCII или аналогичном. Текстовый файл отличается от двоичного файла, который обычно используется для запоминания кодов машинного языка.

Ввод-вывод текстового файла: getc( ), putc( )

Две функции getc( ) и putc( ) работают аналогично функциям getchar( ) и putchar( ) (описанным в предыдущих лекциях). Разница заключается в том, что вы должны сообщить, какой файл следует использовать.

char ch;

ch=getchar( );

предназначена для получения символа от стандартного ввода, а

ch=getc(in);

- для получения символа от файла, на который указывает in.

putchar(ch);

выводит символ на стандартный файл вывода.

putc(ch,t);

предназначена для записи символа ch в файл, на который ссылается указатель t типа FILE.

Ввод-вывод файла: fprintf( ), fscanf( ), fgets( ), fputs( )

Все функции ввода-вывода, которые мы использовали в предыдущих лекциях, имеют аналоги для ввода-вывода файла. Основное отличие состоит в том, что нам нужно использовать указатель типа FILE , чтобы сообщить функциям с каким файлом им следует работать. Подобно getc( ) и putc( ) эти функции используются после функции fopen( ), открывающей файл, и перед fclose( ), закрывающей его.

Функции fprintf( ) и fscanf( )

Эти функции ввода-вывода работают почти как printf( ) и scanf( ) (см. лекцию 4), но им нужен дополнительный аргумент для ссылки на сам файл. Он является первым в списке аргументов. Пример, иллюстрирующий обращение к этим функциям:

#include <stdio.h>

main( )

{

FILE *fi;

int age;

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

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

fclose(fi);

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

fprintf(fi,"Data is %d.\n",age);

/*fi указывает на Data*/

fclose(fi);

}

В отличие от getc( ) и putc( ) эти функции получают указатель типа FILE в качестве первого аргумента.

Функция fgets( )

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

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

#include <stdio.h>

#define MAX 80

main( )

{

FILE *f1;

char *string[MAX]

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

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

puts(string);

}

Мы расположили вводимую информацию в символьном массиве string. Первый из трех аргументов функции fgets( ) является указателем на местоположение считываемой строки. Второй аргумент содержит предельную длину считываемой строки. Функция прекращает работу после считывания символа новой строки или после считывания символов общим числом MAX-1, в зависимости от того, что произойдет раньше. В любом случае нуль-символ '\0' добавляется в самый конец строки. Третий аргумент указывает на файл, который будет читаться. Разница между gets( ) и fgets( ) заключается в том, что gets( ) заменяет символ новой строки на '\0', в то время как fgets( ) сохраняет символ новой строки. Подобно gets( ) функция fgets( ) возвращает значение NULL, если встречает символ EOF . Это позволяет нам проверить, достигли ли мы конца файла.

Функция fputs( )

Эта функция похожа на функцию puts( ). Оператор

l=fputs("Строка", fi);

Код

Положение в файле

0

начало файла

1

текущая позиция

2

конец файла

Передает строку "Строка" в файл, на который ссылается указатель fi типа FILE. Конечно, сначала нужно открыть файл при помощи функции fopen( ).

l является целым числом, которое устанавливается в EOF, если fputs( ) встречает EOF или ошибку. Эта функция не ставит завершающий символ '\0' в конце копируемой строки. В отличии puts функция fputs( ) не добавляет символ новой строки в ее вывод.

Функция fseek( )

Функция fseek( ) позволяет нам обрабатывать файл подобно массиву и непосредственно достигать любого определенного байта в файле, открытом функцией fopen( ). fseek( ) имеет три аргумента и возвращает значение типа int.

Покажем на примере работу fseek( ):

/* использование fseek( ) для печати содержимого файла */

#include <stdio.h>

int main(int number, char *names[])

{

FILE *fp; long set = 0L;

if(number<2)

puts("Введите имя файла в качестве аргумента.");

else {

if ((fp=fopen(names[1],"r")) == 0)

printf("Нельзя открыть %s\n",names[1]);

else {

while(fseek(fp, set++,0) ==0)

putchar(getc(fp));

fclose(fp);

}

}

}

Первый из трех аргументов функции fseek( ) является указателем типа FILE на файл, в котором ведется поиск. Файл следует открыть, используя функцию fopen( ). Второй аргумент "set" . Этот аргумент сообщает, как далеко следует передвинуться от начальной точки (см. ниже). Он должен иметь значение типа long, которое может быть положительным (движение вперед) или отрицательным (движение назад). Третий аргумент является кодом, определяющим начальную точку.

Функция fseek( ) возвращает 0, если все хорошо, и -1, если есть ошибка. Поскольку переменная set инициализирована нулем, при первом прохождении через цикл

while(fseek(fp,set++,0)==0)

putchar(getc(fp));

мы имеем выражение

fseek(fp,OL,0);

означающее, что мы идем в файл, на который ссылается указатель fp, и находим байт, отстоящий на 0 байт от начала, т.е. первый байт. Затем функция putchar( ) печатает содержимое этого байта. При следующем прохождении через цикл переменная set увеличивается до 1L, и печатается следующий байт. То есть, переменная set действует подобно индексу для элементов файла. Процесс продолжается до тех пор, пока set не попытается попасть в fseek( ) после конца файла. В этом случае fseek( ) возвращает значение -1 и цикл прекращается.