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