Int fseek(file *filename, long int offset, int origin);
Функция устанавливает указатель текущий позиции файла F в соответствии со значением начала отсчета origin и смещения offset. Параметр offset равен количеству байтов, на которые будет смещен указатель файла относительно начала отсчета, заданного параметром origin. В качестве значения для параметра origin должно быть взято одно из следующих значений отсчета смещения offset, определенных в заголовке stdio.h:
SEEK_SET — с начала файла;
SEEK_CUR — с текущей позиции;
SEEK_END — с конца файла.
Функция возвращает нулевое значение при успешном выполнение операции, ненулевое — при возникновении сбоя при выполнении смещения
Функция fseek фактически реализует прямой доступ к любому значению в файле. Необходимо только знать месторасположение (номер байта) значения в файле. Рассмотрим использование прямого доступа в двоичных файлах на примере решения следующей задачи.
Задача 3
В созданном раннее двоичном файле D:\\game\\noobs.dat, поменять местами наибольшее и наименьшее из вещественных чисел.
Алгоритм решения задачи состоит из следующих этапов:
чтение вещественных из файла в массив a.
поиск в массиве а максимального (max) и минимального (min) значения и их номеров (imax, imin).
перемещения указателя файла к максимальному значению и запись min.
перемещения указателя файла к минимальному значению и запись max.
Ниже приведен текст программы решения задачи с комментариями.
// #include "stdafx.h" #include <iostream> using namespace std; int main(){ setlocale (LC_ALL, "RUS"); int n, i, imax, imin; double *a, max, min; FILE *f; //открытие файла в режиме чтения и записи f=fopen("D:\\game\\noobs.dat", "rb+"); //считываем из файла в переменную n количество //вещественных чисел в файле fread(&n, sizeof(int), 1, f); cout<<"n="<<n<<endl; //выделяем память для хранения вещественных чисел, //которые будут храниться в массиве a a=new double[n]; //считываем из файла в массив а вещественные числа fread(a, sizeof(double), n, f); //поиск максимального и минимального элементов //в массиве а и их индексов for (imax=imin=0, max=min=a[0], i=1; i<n; i++){ if (a[i]>max){ max=a[i]; imax=i; } if (a[i]<min){ min=a[i]; imin=i; } } //перемещение указателя к максимальному элементу fseek(f, sizeof(int)+imax*sizeof(double), SEEK_SET); //запись min вместо максимального элемента файла fwrite(&min, sizeof(double), 1, f); //перемещение указателя к минимальному элементу fseek(f, sizeof(int)+imin*sizeof(double), SEEK_SET); //запись max вместо минимального элемента файла fwrite(&max, sizeof(double), 1, f); //закрытие файла fclose(f); //освобождение памяти delete []a; system("pause"); return 0; } |
|
