Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ Программирование и основы алгоритмизации...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.5 Mб
Скачать

Форматный обмен с файлами

В этом случае информацию записывают в файл в виде, пригодном для непосредственного (без преобразования) отображения на мониторе, т.е. в символьном виде. Используются функции:

int fprintf (указатель_на_поток, форматная_строка,

список_переменных); //форматированный вывод в файл

int fscanf (указатель_на_поток, форматная_строка,

список_переменных); //форматированный ввод из файла

Для форматного обмена с дисплеем и клавиатурой используются функции:

int printf( форматная_строка,

список_переменных); //форматированный вывод на экран

int scanf (форматная_строка,

список_переменных); //форматированный ввод с клавиатуры

В качестве примера приведем программу, создающую файл int.dat и записывающую в него символьные изображения чисел от 1 до 10 и их квадратов:

#include <stdio.h>

int main()

{ FILE *fp;

int n;

if((fp=fopen(“int.dat”, “w”))==NULL)

{ perror(“int.dat”);

return 1;

}

for(n=1; n<11; n++)

fprintf(fp,”%d %d\n”, n, n*n);

fclose(fp);

return 0;

}

Приведем также программу для форматного чтения данных из файла, используя функцию fscanf ():

#include <stdio.h>

int main()

{ FILE *fp;

int n, nn, i;

if((fp=fopen(“int.dat”, “r”))==NULL)

{ perror(“int.dat”);

return 1;

}

for(i=1; i<11; i++)

{ fscanf(fp,”%d %d”, &n, &n*n);

printf(“ %d %d \n”, n, nn);

}

fclose(fp);

return 0;

}

Позиционирование в потоке

Выше были рассмотрены посимвольный, построчный и форматный обмены с файлами, организованными в виде потока байтов. Эти средства позволяли записать в файл данные и читать из него информацию только последовательно.

Операция чтения (или записи) для потока всегда производится, начиная с текущей позиции в потоке. Начальная позиция чтения/записи в потоке устанавливается при открытии потока и может соответствовать начальному или конечному байту потока в зависимости от режима открытия потока. При открытии потока в режимах r или w указатель текущей позиции чтения/записи в потоке устанавливается на начальный байт потока, а при открытии в режиме a – в конец файла (за конечным байтом). При выполнении каждой операции ввода-вывода указатель текущей позиции в потоке перемещается на новую текущую позицию в соответствии с числом прочитанных (записанных) байтов.

Средства позиционирования в потоке позволяют перемещать указатель (индикатор) текущей позиции в потоке на нужный байт, т.е. дают возможность работать с файлом на диске, как с обычным массивом, осуществляя доступ к содержимому файла в произвольном порядке. В библиотеке языка C имеется функция fseek() для перемещения (установки) указателя текущей позиции в потоке на нужный байт потока (файла). Её прототип:

int fseek(указатель_на_поток, смещение, начало_отсчета);

Смещение задается переменной или выражением типа long и может быть отрицательным, т.е. возможно перемещение по файлу в прямом и обратном направлениях. Начало отсчета задается одной из предопределенных констант, размещенных в заголовочном файле stdio.h:

SEEK_SET (имеет значение 0) – начало файла;

SEEK_CUR (имеет значение 1) – текущая позиция;

SEEK_END (имеет значение 2) – конец файла.

Функция fseek() возвращает 0, если перемещение в потоке (файле) выполнено успешно, в противном случае возвращается ненулевое значение.

Перемещение к началу потока (файла) из произвольной позиции:

fseek(fp, 0L, SEEK_SET);

Перемещение к концу потока (файла) из произвольной позиции:

fseek(fp, 0L, SEEK_END);

Пусть struct str{……} st; Указатель текущей позиции в потоке будет перемещен на одну структуру назад относительно текущей позиции:

fseek(fp, -(long)sizeof(st), SEEK_CUR);

Кроме функции fseek(), в библиотеке языка C имеются функции для работы с указателями текущей позиции в потоке:

long ftell(FILE* fp) – получить значение указателя текущей позиции в потоке;

void rewind(FILE* fp) – установить указатель текущей позиции в потоке на начало потока.