Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Организация произвольного доступа к элементам двоичных файлов

Читайте также:
  1. I. ОРГАНИЗАЦИЯ РАБОЧЕГО МЕСТА ЛАБОРАНТА-ГИСТОЛОГА
  2. II. Методы несанкционированного доступа.
  3. II. Организация и проведение конкурса
  4. II. Организация и проведение конкурса
  5. II. ОРГАНИЗАЦИЯ И ПРОВЕДЕНИЕ ПРАКТИК
  6. II. Организация конкурса внутривузовских научных грантов
  7. II. Организация приема в высшие учебные заведения

Организация произвольного доступа к компонентам файла позволяет считывать значения из любой позиции в двоичном файле, а также записывать новую информацию в любое место в файле.

Для организации произвольного доступа к элементам файла используют функцию fseek(), прототип которой описан в заголовочном файле stdio.h. Синтаксическое описание функции [9]:

int fseek (FILE * stream, long offset, int whence);

Функция fseek() перемещает внутренний указатель файлового потока, изменяя таким образом место в файле, с которого начинается следующая операция чтения или записи. В случае успешного завершения функция возвращает 0, в случае ошибки -ненулевое значение.

Параметры функции:

FILE *stream - yказатель на открытый файловый поток, аналогичной возвращаемому функцией fopen();

long offset - число байтов, на которое нужно переместить файловый указатель в направлении, указанном параметром whence. Для перемещения файлового указателя в обратном направлении (в сторону начала файла), следует устанавливать ofset равным отрицательному значению;

int whence - указывает положение точки отсчета файлового указателя, от которой будет происходить его перемещение. Значения аргумента whence представлены в таблице 8.2.

 

Значения аргумента whence Таблица 4.2

Значение Описание
SEEK_SET Перемещение файлового указателя происходит относительно начала файла
SEEK_END Перемещение файлового указателя происходит относительно конца файла
SEEK_CUR Перемещение файлового указателя происходит относительно текущей позиции файлового указателя

 

При использовании функции fseek() следует соблюдать осторожность, так как из-за ограничений DOS попадание за пределы файла чаще всего не приводит к генерации ошибки, поэтому программисту самому следует принимать меры для предотвращения обращения к диску за пределами известных границ файла.

При организации произвольного доступа используется функция ftell(), осуществляющая навигацию внутри файла. Прототип функции описан в stdio.h. Данная функция возвращает внутренний указатель файлового потока, равный смещению в байтах от начала двоичного файла до байта, с которого начинается следующая операция ввода/вывода. Это значение можно передать функции fseek(), или использовать каким-либо другим образом.

Синтаксическое описание функции:

long ftell(FILE *stream).

Единственным параметром функции является указатель на открытый файловый поток.

Следующие операторы демонстрируют возможности функции fseek():

fseek(f, sizeof(t), SEEK_CUR); - перемещает файловый указатель с текущей позиции на следующую;

fseek(f, -sizeof(t), SEEK_CUR); - на предыдущую позицию;

fseek(f, 0,SEEK_END); - на конец файла.

 

Пример 8.4. Записать ноль на место максимального значения в файле Test.dat.

#include <stdio.h>

#include <stdlib.h>

#include <io.h>

void main ()

{ FILE *f_test;

int i_max; // номер максимального элемента

int handle; // дескриптор файла

int value, max, zero = 0;

f_test = fopen("Test.dat","r+b");

if (! f_test) { puts("Нельзя открыть файл!\n");

exit(1);

}

handle = fileno(f_test); // преобразовать открытый файловый

// поток в дескриптор файла

fread(&max, sizeof(int), 1, f_test);

i_max = 0;

for (int i = 1; i<filelength(handle); i++) // 0 элемент считали

// раньше

{ fread(&value, sizeof(int), 1, f_test);

if (value>max) { max = value;

i_max = i;

}

}

fseek(f_test, i_max*sizeof(int), SEEK_SET);

fwrite(&zero, sizeof(int), 1, f_test);

fclose(f_test);

}

 

Задания для самостоятельной работы.

 

  Переписать данный файл типа integer в обратном порядке.
  Переписать данный файл типа real, поменяв местами его элементы, стоящие на четных и нечетных местах (0 с 1, 2 с 3 и т.д.).
  Переписать данный файл типа integer таким образом, чтобы сначала записать его компоненты, стоящие на нечетных местах, затем – на четных.
  В конец данного файла типа integer поместить его четные элементы.
  В начало данного файла типа char поместить его элементы, являющиеся цифрами.
  В начало данного файла типа real поместить сумму его элементов, меньших введенного с клавиатуры числа, а в его конец - сумму элементов, больших введенного с клавиатуры числа
  В начало данного файла типа integer поместить его элементы, кратные введенному с клавиатуры числу.
  Переписать данный файл типа real, поместив в него сначала положительные, затем отрицательные элементы файла.
  В начало данного файла типа integer поместить его элементы, большие введенного с клавиатуры числа.
  В конец данного файла типа integer поместить его элементы, меньшие среднего арифметического значения элементов этого файла.
  Начиная с позиции, следующей за элементом файла типа integer, являющимся первым элементом, кратным минимальному элементу файла, поместить элементы, кратные минимальному элементу файла.
  Переписать элементы первой половины файла в обратном порядке, а второй в исходном.
  В середину данного файла типа integer поместить его элементы, кратные введенному с клавиатуры числу.
  В середину данного файла типа integer поместить пары элементов файла, в которых первое значение кратно второму или второе значение кратно первому.
  Переписать файл типа real таким образом, чтобы его элементы, стоящие до максимального элемента, оказались после него, а элементы стоящие после максимального элемента оказались перед ним.
  Начиная с позиции, следующей за максимальным элементом файла типа integer, поместить элементы файла, являющиеся делителями максимального элемента.
  В середину данного файла типа integer поместить пары элементов файла, в которых первое значение больше второго.
  Переписать файл типа real таким образом, чтобы элементы первой его половины оказались в конце, а элементы второй половины – в начале:
 
 

 

 

  В середину данного файла типа integer поместить элементы первого из упорядоченных по убыванию фрагментов этого файла.
  Заменить минимальный элемент файла типа integer суммой следующих за ним элементов.
  Заменить первый четный элемент файла типа integer суммой всех четных элементов файла.
  Заменить последний нечетный элемент файла типа integer суммой всех нечетных элементов файла
  Заменить первый элемент файла типа integer, кратный введенному с клавиатуры числу, суммой отрицательных элементов файла.
  Заменить последний четный элемент файла типа integer суммой всех четных элементов файла.
  Заменить последний элемент файла типа integer, кратный введенному с клавиатуры числу, суммой отрицательных элементов файла.
  Заменить первый нечетный элемент файла типа integer суммой всех нечетных элементов файла.
  Заменить минимальный элемент файла типа integer суммой предшествующих ему элементов.
  Заменить максимальный элемент файла типа integer суммой следующих за ним элементов.

 


Дата добавления: 2015-08-09; просмотров: 64 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Последовательный доступ к элементам двоичных файлов| Краткие теоретические сведения

mybiblioteka.su - 2015-2024 год. (0.008 сек.)