Функции fread () и fwrite ()




Файловая система языка С предоставляет две функции, позволяющие читать и писать блоки данных – fread () и fwrite (). Они имеют следующие прототипы:

size_t fread (void * буфер, size_t число_байт, size_t размер, FILE * fp);

size_t fwrite (const void * буфер, size_t число_байт, size_t размер, FILE * fp);

В случае fread() буфер – это указатель на область памяти, которая получает данные из файла. В случае fwrite() буфер – это указатель на информацию, записываемую в файл. Буфер может быть (а чаще всего это так и есть) простой переменной. Длина каждого элемента в байтах определяется в число_байт. Аргумент объем определяет, сколько элементов (каждый длиной число_байт) будет прочитано или записано. Наконец, fp – это указатель на ранее открытый файл.

Функция fread () возвращает число прочитанных элементов. Данное значение может быть меньше чем объем, если был достигнут конец файла или произошла ошибка. Функция fwrite () возвращает число записанных элементов. Данное значение равно объем, если не произошла ошибка.

Если файл был открыт для двоичных данных, то fread () и fwrite () могут читать и писать любой тип данных. Одно из самых наиболее полезных применений fread () и fwrite () – это чтение и запись блоков данных типа массивов и структур. Например, следующий программа записывает содержимое структуры book в файл books.dat, используя один оператор fwrite (). Далее она читает эту структуру, используя один оператор fread (), и выводит значения элементов структуры.

#include <stdio.h>

struct books_type {

char avtor[20];

char nazv[40];

char izd[20];

char year[4];

int num_str;

};

int main (void)

{

register int i;

struct books_type book;

FILE *fp;

 

/* открытие файла на запись */

if ((fp = fopen(“books.dat”, “wb”)) = = NULL) {

printf(“Не могу открыть файл!”);

return 1;

}

 

book.avtor = “Шилдт Г.”;

book.nazv = “Программирование на Borland C++”;

book.izd = “ООО «Попурри»”;

book.year = 1998;

book.num_str = 800;

 

/* запись структуры в файл */

fwrite(book, sizeof book, 1, fp);

fclose(fp);

 

/* открытие файла для чтения */

if ((fp = fopen(“books.dat”, “rb”)) = = NULL) {

printf(“Не могу открыть файл!”);

return 1;

}

 

/* чтение структуры из файла */

fread(book, sizeof book, 1, fp);

 

/* вывод содержимого структуры на экран */

printf(“ Автор книги: %s\n”, book.avtor);

printf(“Название книги: %s\n”, book.nazv);

printf(“ Издательство: %s\n”, book.izd);

printf(“ Год издания: %s\n”, book.year);

printf(“ Число страниц: %s\n”, book.num_str);

fclose(fp);

return 0;

}

 

 

Варианты заданий

1) Дана совокупность сведений, каждое из которых состоит из следующих реквизитов: фамилия и инициалы автора – 25 знаков; название книги – 40 знаков; издательство – 20 знаков; год издания – 4 знака.

Требуется написать программу для выполнения следующих операций:

- ввод совокупности данных (B) и создания файла FW (минимум 10 записей). Данные вводить с клавиатуры;

- вывод записей файла FW с заданной фамилией и инициалами;

- вывод записей файла FW с заданной первой буквой фамилии;

- вывод записей файла FW о книгах, изданных до 1985 года;

- вывод записей файла FW о книгах, изданных конкретным автором до 1984 года.

2) Дана совокупность сведений, каждое из которых состоит из следующих реквизитов: фамилия и инициалы автора – 25 знаков; название книги – 40 знаков; издательство – 20 знаков; год издания – 4 знака.

Требуется написать программу для выполнения следующих операций:

- ввод совокупности данных (B) и создания файла FW (минимум 10 записей). Данные вводить с клавиатуры;

- добавление записей к файлу FW;

- корректировка значений элементов записей файла FW.

3) Дана совокупность сведений, каждое из которых состоит из следующих реквизитов: фамилия и инициалы автора – 25 знаков; название книги – 40 знаков; издательство – 20 знаков; год издания – 4 знака.

Требуется написать программу для выполнения следующих операций:

- ввод совокупности данных (B) и создания файла FW (минимум 10 записей). Данные вводить с клавиатуры;

- сортировка записей файла FW в порядке возрастания по фамилии автора;

- удаление из файла FW записей, у которых значение реквизита «год издания» меньше 1980.

 

4)* Дана последовательность записей, состоящая из реквизитов: шифр цеха (Ц), шифр рабочего (Р), дата (ДТ), шифр детали (Д), количество изготовленных деталей (К).

Написать программу ввода записей и создания файла FZ. Предусмотреть в программе контроль реквизитов записей по следующей схеме: реквизит Ц должен лежать в диапазоне 10 – 20, реквизит Р – в диапазоне 1000 – 1999, реквизит ДТ – в диапазоне 1 – 31, реквизит Д должен состоять из 6 символов, а реквизит К быть целым числом в диапазоне от 1 до 999.

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

5) Дана последовательность записей, состоящая из реквизитов: шифр цеха (Ц), шифр рабочего (Р), дата (ДТ), шифр детали (Д), количество изготовленных деталей (К).

Требуется написать программу для выполнения следующих операций:

- ввод записей и создание файла FZ;

- добавление записей в файл FZ;

- сортировка записей файла FZ в порядке возрастания реквизита Р.

6)* Дана последовательность записей, состоящая из реквизитов: шифр цеха (Ц), шифр рабочего (Р), дата (ДТ), шифр детали (Д), количество изготовленных деталей (К).

Требуется написать программу для выполнения следующих операций:

- ввод записей и создание файла FZ;

- сортировка записей файла FZ в порядке возрастания реквизитов Р и Д.

Сортировка в разрезе двух реквизитов обеспечивает следующую упорядоченность размещения записей: все записи следуют в последовательности возрастания значений реквизита Р, а в пределах группы с одинаковым значением реквизита Р – в порядке возрастания значений реквизита Д.

7)* Дана последовательность записей, состоящая из реквизитов: шифр цеха (Ц), шифр рабочего (Р), дата (ДТ), шифр детали (Д), количество изготовленных деталей (К).

Требуется написать программу для выполнения следующих операций:

- ввод записей и создание файла FZ;

- создание файла NS, каждая запись которого включает реквизиты – шифр детали (Д) и расценку одной детали (РД);

- создание на базе файлов FZ и NS файла FP. Реквизиты записей файла FP включают в себя реквизиты: С, Р, ДТ, Д (передаются из файла FZ) и реквизит С (сумма, начисленная за изготовление деталей данного шифра), вычисляемая умножением реквизита К (количество изготовленных деталей) записей файла FZ на реквизит РД записей файла NS. Поиск записей в файле NS проводится по реквизиту – шифр детали (Д) текущей записи файла FZ. Если в файле NS отсутствует запись с заданным шифром детали, то выдать сообщение: «В файле NS нет расценки детали с шифром <шифр детали>».

8)* Дана последовательность записей с информацией о сотрудниках предприятия. Каждая запись включает реквизиты: ФИО (фамилия, имя, отчество); ДР (дата рождения – год, месяц, число); МР (место рождения – название города); ДТ (дата начала трудового стажа работы – год, месяц, число); П (пол – муж., жен.); СП (семейное положение – женат, холост, число детей); ОБР (образование – высшее, среднее). При программировании реквизиты ФИО, ДР, СП и ДТ объявлять как структуры.

Требуется написать программу для выполнения следующих операций:

- ввод записей и создание файла SV;

- используя файл SV, выдать на экран таблицы:

Возраст Количество мужчин % к итогу
До 20 лет    
20 –30 лет    
30 – 40 лет    
40 – 50 лет    
50 – 60 лет    
Свыше 60 лет    
Итого    

 

Стаж работы Число работающих % к итогу
До 2 лет    
2 –5 лет    
5 – 10 лет    
10 – 15 лет    
Свыше 15 лет    
Итого    

9) Дана последовательность записей, состоящая из реквизитов: шифр поставщика (SP), наименование поставщика (SN), шифр поставляемого изделия (SI), место проживания (город) поставщика (TWN).

Требуется написать программу для выполнения следующих операций:

- ввод записей и создание файла POST;

- вывод на экран списка всех поставщиков из данного города;

- вывод на экран списка поставщиков с данным шифром изделия;

- вывод на экран списка городов, из которых поставляется данный шифр изделия.

10)* Дана последовательность записей, состоящая из реквизитов: Ф.И.О. студента (20 символов); номер зачетной книжки (6 символов); оценки за последнюю сессию (массив из 5 целых чисел); размер стипендии (целое число). При вводе предусмотреть проверку данных на корректность (в качестве оценок использовать числа 5, 4, 3, 2; стипендия не может выйти за пределы диапазона [0, 10000]).

Требуется написать программу для выполнения следующих операций:

- ввод записей и создание файла STUD;

- корректировка записей файла STUD. При перезаписи предусмотреть контроль данных;

- сортировка записей файла STUD в алфавитном порядке по фамилиям студентов;

- вывод на экран таблицы:

Ф.И.О. Номер зач. книжки Средний балл Стипендия
       

 

11) Дана последовательность записей, состоящая из реквизитов: код предприятия (4 символа); код цеха (4 символа); Ф.И.О. работника (25 символов); заработная плата (целое число).

Требуется написать программу для выполнения следующих операций:

- ввод записей и создание файла RAB, состоящего из указанных выше записей;

- создание справочника предприятий (файл, состоящий из записей с реквизитами: код предприятия (4 символа) и наименование (20 символов);

- создание справочника цехов (файл, состоящий из записей с реквизитами: код цеха (4 символа) и наименование (20 символов);

- вывод итог заработной платы по данному цеху.

При вводе данных предусмотреть следующие виды контроля:

- наличие кода предприятия в справочнике предприятий;

- наличие кода цеха в справочнике цехов.

12) Дана последовательность записей, состоящая из реквизитов: Ф.И.О. студента (20 символов); номер зачетной книжки (6 символов); оценки за последнюю сессию (массив из 5 целых чисел); размер стипендии (целое число). При вводе предусмотреть проверку данных на корректность (в качестве оценок использовать числа 5, 4, 3, 2; стипендия не может выйти за пределы диапазона [0, 10000]).

Требуется написать программу для выполнения следующих операций:

- ввод записей и создание файла STUD;

- сортировка записей файла STUD в алфавитном порядке по фамилиям студентов;

- вывод списка студентов, имеющих неудовлетворительные оценки;

- вывод списка студентов, которые получают стипендию более 5000 руб;

- вывод списка студентов, которые поступили в институт в 1999 году (по номеру зачетной книжки).

 

13) Дана совокупность сведений, каждое из которых состоит из следующих реквизитов: фамилия и инициалы автора – 25 знаков; название книги – 40 знаков; издательство – 20 знаков; год издания – 4 знака.

Требуется написать программу для выполнения следующих операций:

- ввод совокупности данных (B) и создания файла FW (минимум 10 записей). Данные вводить с клавиатуры;

- вывод записей файла FW с заданной фамилией и инициалами;

- вывод записей файла FW с заданной первой буквой фамилии;

- вывод записей файла FW о книгах, изданных до 1985 года;

- вывод записей файла FW о книгах, изданных конкретным автором до 1984 года.

14) Дана совокупность сведений, каждое из которых состоит из следующих реквизитов: фамилия и инициалы автора – 25 знаков; название книги – 40 знаков; издательство – 20 знаков; год издания – 4 знака.

Требуется написать программу для выполнения следующих операций:

- ввод совокупности данных (B) и создания файла FW (минимум 10 записей). Данные вводить с клавиатуры;

- добавление записей к файлу FW;

- корректировка значений элементов записей файла FW.

 



Поделиться:




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

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


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