Добавил:
ПОИТ 2016-2020 Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
40
Добавлен:
29.04.2018
Размер:
824.83 Кб
Скачать

Int fread (void *buf, int size, int nrec, file *fd);

Int fwrite (void *buf, int size, int nrec, file *fd);

Записать в файл переменную типа long начиная с позиции 20

long d;

fseek (fd, 20L, SEEK_SET);

fwrite (&d, sizeof(long), 1, fd);

Добавить в файл переменную типа student

struct student

{ char *name;

int id, age;

char pol;

} ;

struct student sb;

fseek (fd, 0L, SEEK_END);

fwrite (&sb, sizeof b, 1, fd);

long filelength (int fd) – длина файла

int fileno (FILE *f) - число, определяющее номер файла

Прочитать с начала файла динамический массив в n переменных типа double

double *pd;

pd = new double[n];

fseek(fd, 0L, SEEK_SET);

fread((void*)pd, sizeof(double), n, fd);

fseek(fd, 20L, SEEK_SET);

fwrite((void*)&a, sizeof(long), 1, fd);

Пример размещения переменной в файле

int prm;

long pos;

fseek(fd, 0L, SEEK_END);

pos = ftell(fd);

fwrite((void*)&prm, sizeof(int), 1, fd);

Пример. В созданном заранее двоичном файле с именем Filebn.dat, поменять местами наибольшее и наименьшее из вещественных чисел.

#include <iostream>

using namespace std;

Int main()

{ setlocale (LC_ALL, "RUS");

int n, i, mx, mn;

double *A, max, min;

FILE *f;

f = fopen("Filebn.dat", "rb+");

fread(&n, sizeof(int), 1, f);

cout<<"n="<<n<<endl;

A = new double[n];

fread(A, sizeof(double), n, f);

for (i = 0; i < n; i++)

cout<<A[i]<<' ';

cout<<endl;

for(mx=mn=0, max=min=A[0], i=1; i <n; i++)

{ if (A[i] > max) { max = A[i]; mx = i; }

if (A[i] < min) { min = A[i]; mn = i; }

}

//перемещение указателя к максим. элементу

fseek(f, sizeof(int)+mx*sizeof(double),

SEEK_SET);

//запись min вместо максим. элемента файла

fwrite(&min, sizeof(double), 1, f);

//перемещение указателя к миним. элементу

fseek(f, sizeof(int)+mn*sizeof(double),

SEEK_SET);

//запись max вместо миним. элемента файла

fwrite(&max, sizeof(double), 1, f);

fclose(f);

f = fopen("Filebn.dat", "rb+");

fread(&n, sizeof(int), 1, f);

fread(A, sizeof(double), n, f);

for (i = 0; i < n; i++) cout<<A[i]<<' '; cout<<endl; fclose(f);

delete []A;

return 0;

}

Пример. Файл записей фиксированной длины

nrec size 0 1 2 m nrec-1

___________________________________________________

int int double double ... ... ... ...

____________________________________________________

2 * sizeof(int)+ m * size - адрес (смещение) записи

int nrec, size; FILE *fd;

// Создать пустой файл

int Create(char *name, int sz)

{ if ((fd=fopen(name,"wb"))==NULL) return 0;

size=sz; nrec=0;

fwrite((void*)&nrec,sizeof(int),1,fd);

fwrite((void*)&size,sizeof(int),1,fd);

fclose(fd); return 1;

}

// Открыть файл

int Open(char *name)

{ if ((fd=fopen(name,"rb+wb"))==NULL) return 0;

fread((void*)&nrec,sizeof(int),1,fd);

fread((void*)&size,sizeof(int),1,fd);

fseek(fd,0L,SEEK_END);

if (ftell(fd)!=2*sizeof(int)+(long)nrec*size) { fclose(fd); return 0; }

return 1;

}

#include <alloc.h>

void *Get(int n)

{ void *pp; if (fd==NULL || n >= nrec) return NULL;

pp = (void*)new char [size];

if (fseek(fd, 2*sizeof(int) + n*size, SEEK_SET) ==EOF) { delete pp; return NULL; }

if (fread(pp, size, 1, fd) !=1) { delete pp; return NULL; }

return pp;

}

// Добавить запись

int Append(void *pp)

{ if (fd==NULL) return 0; fseek(fd,0L,SEEK_END);

if (fwrite(pp,size,1,fd)!=1) return 0;

nrec++;

fseek(fd,0L,SEEK_SET);

if (fwrite((void*)&nrec, sizeof(int), 1, fd)!=1) return 0;

return 1; }

main()

{ Double a,*p[20];

Create (“a.dat”, sizeof(double);

Open (“a.dat”);

for (int i=0;i<20;i++) {a=i; Append((void*)&a);}

for (i=0;i<20;i++) P[i]=Get(19-i);

}

Файл записей переменной длины

Файл записей переменной длины -это простая последовательность записей переменной длины, не содержащая какой-либо дополнительной информации о расположении записей

Файл последовательного доступа

Два способа хранения записей переменной длины в файле:

- специальное значение или код -ограничитель записи (строка текста в памяти, имеющая в качестве ограничителя символ '\0');

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

Пример. Пусть в текстовом файле "a.txt" в папке проекта записано несколько предложений. Конец предложения обозначен точкой. Вывести из текстового файла блок предложений с номера n1 по номер n2.

# include <iostream>

using namespace std;

Соседние файлы в папке Лекции