Функция прямого доступа к файлу
Функция 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); //перемещение назад от текущей позиции на длину переменной аКроме этой функции, для прямого доступа к файлу используются функции:
|
|
Пример 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. | Дан файл 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!