Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Dop_Prog_файл.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
186 Кб
Скачать
☆

3.3 Произвольный доступ к файлу

При обмене данными с файлом (записи и чтении) – место, куда записывается или считывается информация, определяется указателем чтения-записи.

Функция установки указателя чтения- записи на начало файла имеет прототип void rewind(FILE *fp);

Например: rewind(fp);

Функция установки указателя чтения-записи в произвольную точку файла имеет прототип:

Int fseek(file *fp, long offset, int from_where);

Эта функция устанавливает указатель чтения-записи в файле, откры­то­му через поток fp, на offset байт вправо или влево. Если offset>0, то указатель сдвигает­ся в сторону конца файла, если offset<0, то указатель сдвигается в сторону начала файла. Параметр from_where задает точку отсчета для сдвига: SEEK_SET – сдвиг от начала файла, SEEK_CUR – сдвиг от теку­щей позиции указателя, SEEK_END – сдвиг от конца файла. В случае успеха функция возвра­щает 0, иначе – EOF.

Установка указателя чтения-записи левее начала файла считается ошибкой, установка указателя правее конца файла делает значение указателя записи-чтения неопределенным. Например:

//установка казателя чтения-записи через 10байт от начала файла fseek(fp,10L,SEEK_SET);

Функция определения текущего положения указателя чтения-записи имеет прототип: long ftell(FILE *fp);

Эта функция возвращает значение в байтах (тип long) от начала фай­ла до текущего положения указателя чтения-записи файла, открытого через поток fp. В случае ошибки функция возвращает –1L.

Например:

long cur=ftell(fp);

Пример 3.8 Запись и добавление в файл блоков данных (структур) и чтение одной заданной структуры записанных ранее в файл структур.

#include<stdio.h>

#define n 3

struct REC{unsigned id;

char name[20];

unsigned mark;};

int main()

{FILE *out,*in;

REC rec;

int flag, sz=sizeof(REC);

long len,kol,n;

if((out=fopen("mark.txt","wb"))==NULL)

{perror("Выходной файл не открыт"); return 1; }

do{

puts("Введіть № запису, прізвище, оцінку(0..5)");

scanf("%d",&rec.id);

gets(rec.name);

scanf("%d",&rec.mark);

fwrite(&rec,sz,1,out);

puts("Продолжить ввод? Да-1, Нет-0");

scanf("%d",&flag);

}while(flag);

fclose(out);

if((in=fopen("mark.txt","rb"))==NULL)

{perror("Входной файл не открыт"); return 2;}

fseek(in,0,SEEK_END);

len=ftell(in);

kol=len/sz;

printf("В файлі %d записів\n", kol);

puts("Введіть номер запису для читання:");

scanf("%ld",&n);

if(n>0&&n<=kol)

{fseek(in,(i-1)*sz, SEEK_SET);

fread(&rec,sz,1,in);

printf("id=%d name: %s ", rec.id_rec,rec.name);

printf("mark: %d\n",rec.mark); }

else puts("Поза файлом!");

fclose(in);

return 0; }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]