Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ_ОАиП / Лекции ГГУ Скорины - Программирование.doc
Скачиваний:
179
Добавлен:
21.03.2016
Размер:
2.27 Mб
Скачать

28.7. Ввод/вывод блоков данных

Блоковый ввод/вывод чаще всего используется при работе со структурными переменными или массивами. Функции блокового ввода/вывода позволяют переносить между файлом и программой блок данных. Под блоком будем понимать группу подряд расположенных байтов. При использовании функций блокового ввода/вывода файл следует открывать в двоичном режиме, а в качестве размера блока указывать размер переменной sizeof(var). Прототипы функций:

int fwrite(void *ptr, int size, int n, FILE *fp);

int fread(void *ptr, int size, int n, FILE *fp);

Эти функции позволяют читать и записывать блоки данных любого типа.

Функция fwrite() выводит в файл n элементов данных по size байт каждый. Общее число записываемых байт равно n*size. Данные берутся из буфера, на который указывает ptr. В случае успеха функция возвращает число элементов (не байт!), записанных в файл, в случае ошибки – меньшее, чем n значение.

Функция fread() вводит из файла n элементов данных по size байт каждый в память, на которую указывает ptr. Общее число прочитанных байт будет равно n*size. В случае успеха функция возвращает число прочитанных элементов (не байт!), в случае ошибки – меньшее, чем n значение.

char *sa = "abcd";

int a = 10, b = 100;

fout = fopen("out","w"); // текстовый режим

fwrite(sa, sizeof(sa), 1, fout);

fwrite(&a, sizeof(a), 1, fout);

fwrite(&b, sizeof(b), 1, fout);

=== F4 === out === (9 байтов)

abcd ??? // вывод в файл во внутреннем представлении

=== 16-ричный вид === out ===

61 62 63 64 OD 0A 00 64 00 // при вводе 0D 0A => 0A

fout = fopen("out","wb"); // двоичный режим

fwrite(sa, sizeof(sa), 1, fout);

fwrite(&a, sizeof(a), 1, fout);

fwrite(&b, sizeof(b), 1, fout);

=== F4 === out === (8 байтов)

abcd ???

=== 16-ричный вид === out ===

61 62 63 64 0A 00 64 00 // для a=12 => 0C 00 в обоих случаях

Задача. Вывести массив A в файл, а затем ввести данные из файла в массив B.

void main(void) {

FILE *fin, *fout;

int A[10] = {1,2,3,4,5,6,7,8,9,10};

int B[10];

if((fout=fopen("test", "wb")) == NULL) {

printf("Ошибка открытия файла\n"); return;

}

fwrite(A, sizeof(int), 10, fout);

// fwrite(A, sizeof(a), 1, fout);

fclose(fout);

if((fin=fopen("test", "rb")) == NULL) {

printf("Ошибка открытия файла\n"); return;

}

fread(B, sizeof(int), 10, fin);

// fread(B, sizeof(b), 1, fin);

fclose(fin);

printf("Работа программы завершена успешно\n");

}

Задача. Вывести в файл разнотипные данные, а затем ввести их из файла.

void main(void) {

FILE *fin, *fout;

double d = 10.15;

int i = 101;

long l = 1234567L;

if((fout=fopen("test", "wb")) == NULL) {

printf("Ошибка открытия файла\n"); return;

}

fwrite(&d, sizeof(double), 1, fout);

fwrite(&i, sizeof(int), 1, fout);

fwrite(&l, sizeof(long), 1, fout;

fclose(fout);

if((fin=fopen("test", "rb")) == NULL) {

printf("Ошибка открытия файла\n"); return;

}

fread(&d, sizeof(double), 1, fin);

fread(&i, sizeof(int), 1, fin);

fread(&l, sizeof(long), 1, fin);

fclose(fin);

printf("%f\n%d\n%ld\n", d, i, l);

printf("Работа программы завершена успешно\n");

}

В качестве буфера можно использовать (и часто именно так и делают) просто память, в которой размещена переменная.

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

struct Student {

char fio[50];

int year;

char adr[80];

} stud;

fwrite(&stud, sizeof(struct Student), 1, fout);

fread(&stud, sizeof(struct Student), 1, fin);