Функция прямого доступа к файлу



Функция read при корректном выполнении осуществляет последовательное чтение данных из файла. Однако при работе с файлами на нижнем уровне можно изменять порядок доступа к данным с последовательного на произвольный. Для этого используется функция fseek.

Синтаксис:

int fseek(FILE *f, long off, int org);

где f – указатель на файл;

off – позиция смещения;

org – начало отсчета.

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

Константы, задающие начало отсчета

Константа Значение Описание
SEEK_SET 0 начало файла
SEEK_CUR 1 текущая позиция
SEEK_END 2 конец файла

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

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

Например, для текстовых файлов:

fseek(f,0L,SEEK_SET); //перемещение к началу потока из текущей позицииfseek(f,0L,SEEK_END); //перемещение к концу потока из текущей позиции

Например, для двоичных файлов:

fseek(f,(long)sizeof(a),SEEK_SET); //перемещение вперед от начала на длину переменной аfseek(f,-(long)sizeof(a),SEEK_CUR); //перемещение назад от текущей позиции на длину переменной а

Кроме этой функции, для прямого доступа к файлу используются функции:

long ftell(FILE *f);//получает значение указателя текущей позиции в потокеvoid rewind(FILE *f);//устанавливает значение указателя на начало потока

Пример 1. Использование в программе функций доступа к данным на нижнем уровне.

#include "stdafx.h"#include <iostream>using namespace std;#include <fcntl.h> #include <sys\stat.h>#include <io.h>int _tmain(int argc, _TCHAR* argv[]){ int fh1, fh2; //открытие файла на нижнем уровне fh1 = open("data1.dat", O_RDONLY); //проверка корректности открытия файла if (fh1 == -1) perror("Open failed on input file"); fh2 = open("data2.dat",O_WRONLY|O_TRUNC|O_CREAT,S_IREAD|S_IWRITE); if (fh2 == -1) perror("Open failed on output file"); system("pause"); return 0;}

Пример 2. Использование в программе позиционирования файлового указателя с помощью функции fseek в двоичном файле.

#include "stdafx.h"#include <iostream>using namespace std;#include <io.h>int _tmain(int argc, _TCHAR* argv[]){ FILE *f;//указатель на двоичный файл int i,n=10; char s[]="String"; float r; f=fopen("file_bin","wb"); //создание двоичного файла для записи for(i=1;i<=n;i++){     r=pow(i,1.0/3); fwrite(s,sizeof(s),1,f); //запись строки String в файл fwrite(&i,sizeof(int),1,f); //запись целого числа (номера строки) в файл fwrite(&r,sizeof(float),1,f); //запись вещественного числа (корня кубического) в файл printf("\n%s %d %f",s,i,r);//контрольный вывод на экран } fclose(f);//закрытие файла printf("\n"); f=fopen("file_bin","rb"); //открытие двоичного файла для чтения for(i=n; i>0; i--) { //перемещение указателя файла fseek(f,(i-1)*(sizeof(s)+sizeof(int)+sizeof(float)),SEEK_SET); fread(&s,sizeof(s),1,f);//чтение строки fread(&n,sizeof(int),1,f);//чтение целого числа fread(&r,sizeof(float),1,f); //чтение вещественного числа printf("\n%s %d %f",s,n,r); //вывод на экран содержимого файла }   system("pause"); return 0;}

Задания для выполнения

  1. Составьте программу, копирующую содержимое данного файла побайтно в другой файл.
  2. Составьте программу, определяющую размер файла в байтах с использованием функций прямого доступа.
  3. Составьте программу, копирующую содержимое данного файла побайтно в обратном порядке.
  4. Составьте программу, которая выводит свой текст на экран. Используйте работу с файлами на нижнем уровне.
  5. Индивидуальные задания.

 

Вариант Задание
1. Дан файл f, компоненты которого являются действительными числами. Найти произведение компонент файла.
2. Дан файл f, компоненты которого являются целыми числами. Никакая из компонент файла не равна нулю. Файл f содержит столько же отрицательных чисел, сколько и положительных. Используя вспомогательный файл h, переписать компоненты файла f в файл g так, чтобы в файле g сначала шли положительные, потом отрицательные числа.
3. Дан файл f, компоненты которого являются целыми числами. Получить в файле g все компоненты файла f, являющиеся точными квадратами.
4. Дан файл f, компоненты которого являются действительными числами. Найти сумму наибольшего и наименьшего из значений компонент.
5. Дан файл, содержащий различные даты. Каждая дата – это число, месяц и год. Найти год с наименьшим номером.
6. Дан файл f, компоненты которого являются действительными числами. Найти модуль суммы и квадрат произведения компонент файла.
7. Дан файл f, компоненты которого являются действительными числами. Найти разность первой и последней компонент файла.
8. Дан файл f, компоненты которого являются целыми числами. Найти количество чётных чисел среди компонент.
9. Дан символьный файл f. Получить копию файла в файле g.
10. Даны символьные файлы f1 и f2. Переписать с сохранением порядка следования компоненты файла f1 в файл f2. Использовать вспомогательный файл h.
11. Дан файл f, компоненты которого являются действительными числами. Найти сумму компонент файла.
12. Дан символьный файл f. В файле не менее двух компонент. Определить, являются ли два первых символа файла цифрами. Если да, то установить, является ли число, образованное этими цифрами чётным.
13. Дан файл f, компоненты которого являются целыми числами. Получить в файле g все компоненты файла f являющиеся чётными числами.
14. Дан файл f, компоненты которого являются действительными числами. Найти наибольшее из значений модулей компонент с нечётными номерами.
15. Дан файл f, компоненты которого являются действительными числами. Найти последнюю компоненту файла.
16. Дан файл, содержащий различные даты. Каждая дата - это число, месяц и год. Найти все весенние даты.
17. Дан файл f, компоненты которого являются целыми числами. Получить в файле g все компоненты файла f, делящиеся на 3 и не делящиеся на 7.
18. Дан файл f, компоненты которого являются действительными числами. Найти наименьшее из значений компонент с чётными номерами.
19. Записать в файл g все чётные числа файла f, а в файл h все нечётные. Порядок следования чисел сохраняется.
20. Дан символьный файл f .Записать в файл g компоненты файла f в обратном порядке.
21. Дан файл, содержащий различные даты. Каждая дата - это число, месяц и год. Найти самую позднюю дату.
22. Даны символьные файлы f и g. Записать в файл h сначала компоненты файла f, затем компоненты файла g с сохранением порядка.
23. Дан файл f, компоненты которого являются целыми числами. Никакая из компонент файла не равна нулю. Файл f содержит столько же отрицательных чисел, сколько и положительных. Используя вспомогательный файл h, переписать компоненты файла f в файл g так, чтобы в файле g не было двух соседних чисел с одним знаком.
24. Дан файл f, компоненты которого являются целыми числами. Найти количество квадратов нечётных чисел среди компонент.
25. Дан файл f, компоненты которого являются действительными числами. Найти сумму квадратов компонент файла.
26. Дан файл, содержащий различные даты. Каждая дата – это число, месяц и год. Найти год с наибольшим номером.
27. Дан файл f, компоненты которого являются целыми числами. Получить в файле g все компоненты файла f, делящиеся на 2 и на 5.

 


Дата добавления: 2021-07-19; просмотров: 114; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!