Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / WORD / Лекции по ЯП (часть 3).doc
Скачиваний:
135
Добавлен:
15.04.2015
Размер:
1.34 Mб
Скачать

Символьный вывод

Имеется несколько функций символьного вывода, которые необходимо знать: putc(), fputc() и fputs().

Функции putc() и fputc()

Библиотечные функции putc() и fputc() записывают одиночный символ в заданный поток вывода. Функция putc () имеет следующий прототип, объявленный в файле stdio.h:

int putc(int ch, FILE *fp);

Аргумент ch — это символ, который нужно вывести. Как и в других функциях символьного вывода, он формально имеет тип int, но фактически используется только eго младший байт.

Аргумент fр — это указатель на поток, ассоциированный с файлом (возвращается из функции fopen() при открытии файла).

Функция putc() возвращает выведенный символ (в случае успеха) или EOF (в случае ошибки). Символическая константа EOF определена в файле stdio.h и имеет значение -1. Поскольку это значение не соответствует никакому реальному символу, его можно использовать для указания конца файла (только в текстовом режиме).

Функция fputs()

Для записи строки символов в файл используется библиотечная функция fputs(). Она практически идентична функции puts().Единственное отличие состоит в том, что для fputs() необходимо указать поток вывода. Кроме того, fputs() не добавляет символ конца строки автоматически— если он нужен, программисту приходится делать это самостоятельно другими средствами. Ее прототип объявлен в файле stdio.h:

char fputs(char *str, FILE *fp);

Аргумент str — это указатель на строку с завершающим нулевым символом, которую следует вывести,

fр — указатель на структуру FILE, возвращенный из функции fopen() при открытии файла. Строка str записывается в файл, причем нулевой завершающий символ отбрасывается. Функция fputs() возвращает положительное значение в случае успеха аи EOF, если произошла ошибка.

Блочный ввод-вывод

Блочный ввод-вывод используется в основном при сохранении данных, которые затем будет считывать та же самая или другая программа на Си. Этот способ ввода-вывода используется только с двоичными файлами. В процессе блочного вывода блоки данных копируются целиком из памяти на диск. Блочный ввод представляет собой обратный процесс: блоки данных считываются с диска в память. Например, с помощью одного вызова функции блочного вывода можно записать на диск сразу целый массив типа double, а затем одним вызовом функции блочного ввода считать весь этот массив с диска обратно в память. Блочный ввод-вывод выполняется функциями fread() и fwrite().

Функция fwrite()

Библиотечная функция fwrite() записывает блок данных из памяти в двоичный файл. Ее прототип, объявленный в файле stdio. h, имеет следующий вид:

int fwrite(void *buf, int size, int count, FILE *fp);

Аргумент buf представляет собой указатель на участок памяти, содержащий данные для записи в файл. Он объявлен с типом void — это означает, что аргумент может быть указателем любого типа.

Аргумент size указывает размер в байтах отдельных элементов данных в блоке, а аргумент count— их общее количество.

Например, если нужно записать в файл массив из 100 целочисленных значений, то size будет равен 2 (переменные типа int занимают два байта), а count будет равен 100 (в массиве 100 элементов). Для вычисления аргумента size можно воспользоваться операцией sizeof ().

Аргумент fр, как и ранее, является указателем на структуру FILE, возвращенным из функции fopen() при открытии файла.

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

if ( (fwrite (buf, size, count, fp)) != count)

fprintf(stderr, "Ошибка чтения файла.");

Несколько примеров использования функции fwrite().

Для записи в файл одной переменной х типа double используется следующий оператор:

fwrite (&x, sizeof(double), 1, fp);

Массив data[], содержащий 50 структур типа address, можно записать любым из двух способов:

fwrite (data, sizeof (address), 50, fp); или fwrite(data, sizeof (data), 1, fp);

Первый оператор записывает массив из 50 элементов, каждый длиной со структуру address. Во втором операторе массив data считается одним элементом. Результаты выполнения этих операторов совершенно одинаковы.

Функция fread()

Библиотечная функция freed() считывает блок данных из двоичного файлового потока в память. Вот ее прототип, объявленный в файле stdio.h:

int fread (void *buf, int size, int count, FILE *fp);

Аргумент buf представляет собой указатель на участок памяти, в который помещаются данные из файла. Как и в функции fwrite (), указатель имеет тип void.

Аргумент size указывает размер (в байтах) отдельных элементов данных считываемого блока, a count — их общее количество. Вспомните, что аналогичные аргументы имеет и функция fwrite(). Для вычисления аргумента size часто используется операция sizeof (). Аргумент fp— это, как всегда, указатель на структуру FILE, возвращенный функцией fopen() при открытии файла. Функция fread() возвращает количество считанных элементов данных. В случае ошибки или достижения конца файла это число может быть меньше аргумента count.