Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

Описание

uses stdio;

function fflush(_stream:pfile):integer;

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

Поток _stream остается открытым после завершения процедуры fflush. Как и процедура fclose, процедура fflush возвращает постоянную EOF в случае ошибки и нулевое значение – в случае успеха. (Значение постоянной EOF задано в файле stdio равным –1. Оно обозначает конец файла, но может также использоваться для обозначения ошибок.)

11.4. Посимвольный ввод/вывод: процедуры getc и putc Описание

uses stdio;

function getc(inf:pfile):integer;

function putc(c:integer; outf:pfile):integer;

Наиболее простыми из процедур стандартной библиотеки ввода/вывода являются процедуры getc и putc. Процедура getc возвращает очередной символ из входного потока inf. Процедура putc помещает символ, обозначенный параметром с, в выходной поток outf.

В обеих процедурах символ с имеет тип integer, а не char, что позволяет процедурам использовать наборы 16-битовых «широких» символов. Это также позволяет процедуре getc возвращать значение –1, находящееся вне диапазона возможных значений типа char. Постоянная EOF используется процедурой getc для обозначения того, что либо достигнут конец файла, либо произошла ошибка. Процедура putc также может возвращать значение EOF в случае ошибки.

Следующий пример является новой версией процедуры copyfile, представленной в главе 2; в данном случае вместо использования вызовов fdread и fdwrite используются процедуры getc и putc:

uses stdio;

(* Скопировать файл f1 в файл f2

* при помощи стандартных процедур ввода/вывода

*)

function copyfile(const f1, f2:pchar):integer;

var

inf, outf:pfile;

c:longint;

begin

inf := fopen (f1, 'r');

if inf = nil then

begin

copyfile:=-1;

exit;

end;

outf := fopen (f2, 'w');

if outf = nil then

begin

fclose (inf);

copyfile:=-2;

exit;

end;

c := getc (inf);

while c <> EOF do

begin

putc (c, outf);

c := getc (inf);

end;

fclose (inf);

fclose (outf);

copyfile:=0;

end;

Копирование выполняет внутренний цикл while. Снова обратите внимание на то, что переменная с имеет тип longint, а не char.

Упражнение 11.1. В упражнениях 2.4 и 2.5 мы описали программу count, которая выводит число символов, слов и строк во входном файле. (Напомним, что слово определялось, как любая последовательность алфавитно-цифровых символов или одиночный пробельный символ.) Перепишите программу count, используя процедуру getc.

Упражнение 11.2. Используя процедуру getс, напишите программу, выводящую статистику распределения символов в файле, то есть число раз, которое встречается в файле каждый символ. Один из способов сделать это состоит в использовании массива целых чисел типа long, который будет содержать счетчики числа символов, а затем рассматривать значение каждого символа в качестве индекса увеличиваемого счетчика массива. Программа также должна рисовать простую гистограмму полученного распределения при помощи процедур printf и putc.

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal