ПАСКАЛЬ: БУФЕРИЗАЦІЯ ВВЕДЕННЯ-ВИВЕДЕННЯ
Якщо в кінці роботи з файлом не указати викликів flush чи close, то зміст внутрішнього буфера так і не потрапить у зовнішній буфер і у файл.
Приклад 2. Здається, наступна програма задає копіювання текстів:
program wrongcpy;
var f, g : text; c : char;
begin
assign(f, ...); assign(g, ...); reset(f); rewrite(g);
while not eof(f) do
begin read(f, c); write(g, c) end;
{тут не вистачає close(g) ! Хоча й close(f) не завадить...}
end.
Спробуйте цю програму запустити, і побачите, що якщо початковий файл – пісня, то файл-"копія" – теж пісня, але недоспівана. А все тому, що "кінець пісні" так і залишається у внутрішньому буфері.
Змінну під внутрішній буфер варто означати глобальною в програмі. Якщо означити та зв’ язати файлову змінну в програмі, а її внутрішній буфер означити у підпрограмі, то по закінченні виклику підпрограми файлова змінна буде доступною, а її буфер – ні. Спроба скидання з такого буфера по закінченні програми може призвести до непередбачених наслідків. Але якщо вся робота з файлом, від assign до close, описана в підпрограмі, то й буфер цілком природньо означити в ній же.
Приклад 3. Розглянемо програму з процедурою spoilbuf, тобто "зіпсувати буфер", за виклику якої змінюється буфер, що залишається в локальній пам’ яті після закінчення попередньої процедури fillbuf.
program foolish;
var f : text;
procedure fillbuf;
var buf : array[1..5]of char;
begin
settextbuf(f, buf); rewrite(f); write(f, 'abcdefgh');
end;
procedure spoilbuf;
begin end;
begin