АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Файлы произвольного доступа

Читайте также:
  1. Выписки из закона Украины для доступа на крышу
  2. Выражение координат произвольного вектора через компоненты радиус-векторов.
  3. Вычисление полного времени доступа.
  4. Дикторский текст литературного сценария фильма «Гибель империи. Византийский урок». – Режим доступа: www.pravoslavie.ru/jurnal/080211112807
  5. Информационное обеспечение. Файлы данных. Принципы передачи и кодирования информации.
  6. Нормативно-правовое регулирование работы с информацией ограниченного доступа.
  7. Обеспечение доступа к информационным ресурсам
  8. Организация доступа к файлам. Иерархический доступ к файлам. Понятие атрибутов доступа. Организация доступа к файлам различных ОС.
  9. Основные методы доступа
  10. Разграничение прав доступа пользователей
  11. Секции, проекции и проецируемые файлы.
  12. Скважина – цилиндрическая горная выработка, имеющая длину во много раз больше диаметра, сооружаемая без доступа в нее человека

Для выполнения произвольного доступа применяется функция fseek, позволяющая обрабатывать файл подобно массиву и непосредственно достигать любого определенного байта. Эта функция имеет вид:

fseek (stream, offset, origin);

stream – указатель на файл;

оrigin – указатель направления отсчета.

Функция перемещает (внутренний) указатель файла, связанного с потоком stream на новое место в файле, которое вычисляется по смещению offset и указанию направления отсчета origin.

Следующая операция с указанным потоком stream будет выполнена, начиная с той позиции, на которое произошло перемещение. Аргумент origin должен быть одной из следующих констант:

0 – начало файла;

1 – текущая позиция указателя файла;

2 – конец файла.

Для того, чтоб перемещать указатель, необходимо знать количество символов в записи. Для дальнейших рассуждений обозначим номер записи через n, а количество символов в записи – через m.

Рассмотрим ситуацию, когда origin = 0. Тогда для того, чтобы установить указатель на запись с номером n offset должен быть вычислен по следующей формуле:

оffset = (n-1)*m

Рассмотрим вторую ситуацию, когда origin = 1. Установим указатель на начало файла (offset=0). Для того, чтобы перейти на следующую (вторую) запись offset должен быть равен нулю. Для перехода с первой на третью запись offset = m и т.д.

Можно двигаться не только от начала к концу файла, но и в обратном направлении. Для этого offset должен быть отрицательным. Например, если указатель стоял на пятой записи, то для того, чтоб перейти на четвертую offset = -2*m, а для перехода с пятой на третью offset = -3*m и т. д.

Рассмотрим третью ситуацию, когда origin = 2. В этом случае указатель перемещается от конца файла. Параметр offset может быть как с плюсом, так и с минусом. Например, для того, чтобы переместить указатель на предпоследнюю запись, offset должен быть вычислен по формуле: offset = 2*m

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

handle =open (“имя файла”, O_CREATE);

l = file length (handle);

close (handle);

Переменная handle имеет тип int, а переменная 1 так же, как переменная offset – тип long. После выполнения приведённых выше операторов размер файла содержится в переменной 1. Для работы операторов, определяющих размер файла, перед программой необходимо добавить процедуры:

# include < fcnt.h >

# include < io.h >

На рис.2 представлена программа, демонстрирующая прямой доступ. Первая часть программы, обеспечивающая создание файла практически такая же, как и предыдущая. Исключение состоит в том, что для каждой переменной в операторе fprintf определён размер.

Длина записи определяется, как сумма размеров определённых переменных плюс единица, т.е. для нашего примера n = 28. Далее идёт группа операторов, определяющих длину файла.

Следом идёт оператор, инициализирующий переменную n. Переменная n несёт двойную нагрузку. С одной стороны она является признаком окончания цикла (входит в оператор while), с другой определяет номер записи. Затем вычисляется значение переменной offset по формуле, смысл которой описан выше. Эта формула применена в данной программе, т.к. используемый в дальнейшем оператор fseek работает в параметром origin равным нулю. Оператор if контролирует выход указателя за начало или конец файла. Если выведено значение n равное нулю, то цикл прекращается. Если произошёл выход за конец файла (offset >= 1), то игнорируются все последующие операторы цикла, но работу можно будет продолжать, т.е. ввести следующий номер записи. Если выход за пределы файла не произошёл, то выполняются операторы цикла, смысл которых не требует дополнительных пояснений.

# include <stdio.h>

# include <fcntl.h>

# include <io.h>

main ()

{char fio[10], gr [5];

float st;

long offset,l;

int p=1, handle, n;

FILE *lf;

clrscr ();

lf=fopen(“student.dat”,”w”);

while(p)

{

printf(“Введите сведения о студенте”);

printf(“\n Введите Ф.И.О.”);

scanf(“%s”,&fio);

printf(“\n Введите номер группы”);

scanf(“%s”,&gr);

printf(“\n Введите размер стипендии”);

scanf(“%s”,&st);

fprintf(lf,“%15s%6s%6.2f ”,fio,gr,st);

printf(“\n Признак окончания ввода”);

scanf(“%s”,&p);

}

fclose (lf);

handle = open(“student.dat”,O_CREAT);

l=filelength(handle);

close(handle);

n=1;

lf=fopen(“student.dat”,”r ”);

while(n)

{

printf (“Введите номер о записи”);

scanf (“%d”,&n);

offset=(n-1)*28;

if (offset>=1 | | n==0) continue;

fseek (lf,offset,0);

fscanf (lf,”%s %s %f ”,&fio,&gr,&st);

printf (“%15s%6s%6.2f\n”,fio,gr,st);

}

fclose(lf);

}

рис.2

Задание

2.1. Создать файл последовательного доступа. Добавить к файлу несколько записей. Прочитать файл, выполнив указанное в задании действие.

2.2. Создать файл прямого доступа. Прочитать одну из записей созданного файла. В вариантах, имеющих нечетный номер, параметр offset взять равным единице, в четных вариантах offset имеет значение 2. При чтении файла необходимо обеспечить проверку, чтобы не допустить выход указателя за предел файла.

 

№ вар Задание
1. Информация, входящая в файл: Ф.И.О., номер телефона, адрес, стоимость переговоров. При чтении файла вывести сведения о клиенте с указанным номером телефона.
2. Воспользовавшись информацией из варианта №1, найти номер телефона клиента с указанной фамилией.
3. Воспользовавшись информацией из варианта №1, вывести сведения о клиенте с указанной фамилией.
4. Информация, входящая в файл: Ф.И.О. автора, название книги, издательство, стоимость. При чтении файла вывести информацию о книгах указанного автора.
5. Воспользовавшись информацией из варианта №4, получить общую стоимость всех книг.
6. Воспользовавшись информацией из варианта №4, вывести сведения о всех книгах указанного издательства.
7. Информация, входящая в файл: Ф.И.О., адрес, место работы,зарплата. При чтении файла вывести информацию о всех сотрудниках ПГУ.
8. Воспользовавшись информацией из варианта №7, вывести сведения о сотрудниках ПГУ, зарплата которых не превышает 200 тенге.
9. Воспользовавшись информацией из варианта №7, вывести сведения о сотруднике с указанной фамилией.
10. Информация, входящая в файл: размер костюма, расход ткани, стоимость, форма. При чтении файла выдать сведения о конкретном размере костюма.
11. Воспользовавшись информацией из варианта №10, выдать сведения о стоимости всех костюмов.
12. Воспользовавшись информацией из варианта №10, выдать сведения о костюмах стоимостью 300 тенге
13. Воспользовавшись информацией из варианта №10, выдать сведения о костюмах, произведенных указанной фирмой.
14. Информация, входящая в файл: номер рейса, вес багажа, количество вещей. При чтении файла определить количество пассажиров, вес багажа которых превышает 30 кг.
15. Воспользовавшись информацией из варианта №14, определить средний вес багажа.
16. Воспользовавшись информацией из варианта №14, определить количество пассажиров, вес багажа которых превосходит средний.
17. Воспользовавшись информацией из варианта №14, определить общий вес багажа.
18. Воспользовавшись информацией из варианта №14, определить общее количество вещей.
19. Информация, входящая в файл: Ф.ИО. студента, группа, оценка по ВТ. При чтении файла подсчитывается средний балл по ВТ.
20. Воспользовавшись информацией из варианта №19, определить, какое количество студентов имеет неудовлетворительные оценки.
21. Воспользовавшись информацией из варианта №19, вывести Ф.И.О. студентов, имеющих отличные оценки.
22. Воспользовавшись информацией из варианта №19, вывести Ф.И.О. студентов, имеющих оценки выше среднего балла.
23. Информация, входящая в файл: номер детали, наименование, количество, стоимость. При чтении файла определить общую стоимость детали.
24. Воспользовавшись информацией из варианта №23, определить количество деталей определенного наименования.
25. Воспользовавшись информацией из варианта №23, определить количество деталей, стоимость которых не превышает 25 тенге.

 

Литература

1. Подбельский В.В. Язык Cu ++: Учебное пособие. - М.: Финансы и статистика,1995, - 560 с.

2. Страуструп Б. Язык программирования Сг ++. - М.: Радио и связь, 1991. - 352 стр.

3. Собоцинский В.В. Практический курс Turbo Cu ++. Основы объктно- ориентированного программирования. - М.: Свет, 1993. - 236 с.

4. Романов В.Ю. Программирование на языке Cu ++. Практический подход. - М.: Компьтер, 1993. - 160 с.

5. Уинер Р. Язык турбо Cu. - М.: Мир, 1991. - 384 с.

6. Юлин В.А., Булатова И.Р. Приглашение к Cu. - Мн.: Высш. Шк., 1990,- 224 с.

7. Котлинская Г.П., Галиновский О.И. Программирование на языке Cu. -Мн.: Высш. Шк., 1991. - 156 с.

 


1 | 2 | 3 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.007 сек.)