В) Блоковый ввод-вывод

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

Недостатком подобного способа сохранения является то, что полученный файл не будет иметь текстовый формат, и читать из него данные в правильном виде способна лишь программа, «знающая» порядок и типы хранения в нем данных. Тем не менее, если хранимые данные содержат символы (тип char), то они обычно будут видны при просмотре «Блокнотом», часто вперемежку со специальными символами.

Блоковый ввод-вывод осуществляется следующими функциями:

int fread(void *p, int size, int n, FILE *f) - считывает n блоков по size байт каждый из файла f в область памяти с адресом p (необхо­димо заранее отвести память под считываемый блок);
int fwrite (void *p, int size, int n, FILE *f) - записывает n блоков по size байт каждый из области памяти с адресом p в файл f.  

В функциях блокового ввода-вывода количество байт задается несколько сложным образом: вводится термин «блок». Это – совершенно условная единица, под которой понимается любое заданное конкретное число байт. Программист должен указать как «размер блока», так и «число блоков»; реальное количество байт будет их произведением. Такой формат удобен при чтении/записи массива как целого.

Результатом этих функций является количество успешно прочтенных/записанных блоков. Оно равно n, либо меньше (при невозможности прочесть/записать n блоков). Неравенство результата значению n является признаком либо сбоя, либо достижения конца файла.

Например, если в файле хранится массив целых чисел, и его размер неизвестен (известно лишь, что он не превосходит 10000), то и весь массив, и его длину можно прочесть одной командой:

 

int a[10000],n;

n=fread(a, sizeof(int), 10000, f);

 

Здесь мы пытаемся прочесть в массив 10000 «блоков», где каждый блок – одно число типа int; реально будет прочтено столько чисел, сколько есть в файле, и это количество присвоено n.

 

Замечание. Функции блокового ввода-вывода трудно применить к переменной типа String, т.к. в типе String (см. тему «Строки») текст хранится отдельно от самой переменной, представляющей собой лишь указатель на этот текст. Если необходимо выполнить блоковый ввод-вывод структуры, содержащей текст, рекомендуется поэтому ее текстовые поля объявлять не как String, а как массив char.