Паскаль: буферизація введення-вивединня, Детальна інформація
Паскаль: буферизація введення-вивединня
while not eof do
begin
write( 'Задайте ціле число>' ); read( V )
end;
writeln ( 'V=', V:1 )
При виконанні eof комп'ютер чекає натискань на клавіші. Запрошення до введення числа на екрані ще не з’ явилося. Якщо натиснути Ctrl-Z та Enter, то з виклику eof повертається false, і виконання фрагмента закінчується друкуванням тексту V=0. За натискань цифрових клавіш цифри відображаються на екрані й накопичуються у внутрішньому буфері клавіатури. Після натискання на Enter виконання eof закінчується й повертається значення false. Після цього, тобто лише після набору на клавіатурі першої сталої (!) виконується тіло циклу і з'являється запрошення 'input number>'.
При виконанні read лише аналізуються символи, накопичені у внутрішньому буфері за виконання виклику eof. Якщо вони утворюють сталу, то відповідне значення присвоюється змінній V, після чого повторюється виклик eof тощо. Отже, введення символів із клавіатури в такому циклі відбувається за викликів eof, а не read! Таким чином, щоб запрошення друкувалося до початку введення першої сталої, варто перед циклом додати виклик write('input number>').
Ще раз повернемося до уживання процедури readln замість read. Якщо при виконанні наведеного циклу за черговою сталою після пропуску випадково набрати непорожні символи, що не задають сталу, то вони залишаться у внутрішньому буфері. Далі з виклику eof повернеться false, і аналіз цих символів за виконання read призведе до аварійного завершення програми. Якщо ж замість read записати readln, то після обробки сталої ці символи пропускаються, тому що набираються перед Enter, і програма виконується нормально.
15.4. Тип безтипових файлів
Розглянемо програму посимвольного копіювання файлів:
program StupidCopy;
var f, g : file of char; c : char; s : string;
begin
writeln('Задайте ім'я початкового файла');
readln(s); assign(f, s);
writeln('Задайте ім'я цільового файла');
readln(s); assign(g, s);
reset(f); rewrite(g);
while not eof(f) do
begin
read(f, c); write(g, c);
end;
close(f); close(g);
end.
Здається, що при виконанні цієї простенької програмки все гаразд, оскільки за рахунок використання буферів фізичні файли читаються-записуються порціями по кілька блоків, пристрої при цьому працюють найкращим чином, а переміщення інформації відбуваються головним чином усередині оперативної пам’ яті, тобто швидко.
Спробуйте запустити її на виконання, указавши вхідним файл розміром у кілька сотень кілобайтів – виконання займе секунди й десятки секунд. Напрошується висновок, що при її виконанні дещо здійснюється не найкращим чином. Розглянемо один із способів прискорення роботи з файлами.
Система Турбо Паскаль дозволяє створити додатковий власний буфер і власноруч описати його застосування. Це виявляється набагато ефективнішим від використання буферів, що забезпечуються системою. А реалізується це за допомогою безтипових файлів.
Тип безтипових файлів задається словом file. Файлову змінну цього типу, як і всіх інших файлових типів, треба спочатку зв’ язати з фізичним файлом і відкрити, установивши в початковий стан для читання чи запису. Процедури відкривання RESET і REWRITE тут мають по 2 параметри. Крім імені файлової змінної, у їх виклику вказується розмір "зовнішнього буфера" в байтах. Цей буфер ще називається блоком і явно в Паскаль-програмі не позначається. Через нього дані копіюються з фізичного файла до "внутрішнього буфера". Розмір блока може бути в межах від 1 до 65535. Як не дивно, найкраще встановити його рівним 1:
ReSet(f, 1) або ReWrite(g, 1).
Чому саме так, ми скажемо далі.
begin
write( 'Задайте ціле число>' ); read( V )
end;
writeln ( 'V=', V:1 )
При виконанні eof комп'ютер чекає натискань на клавіші. Запрошення до введення числа на екрані ще не з’ явилося. Якщо натиснути Ctrl-Z та Enter, то з виклику eof повертається false, і виконання фрагмента закінчується друкуванням тексту V=0. За натискань цифрових клавіш цифри відображаються на екрані й накопичуються у внутрішньому буфері клавіатури. Після натискання на Enter виконання eof закінчується й повертається значення false. Після цього, тобто лише після набору на клавіатурі першої сталої (!) виконується тіло циклу і з'являється запрошення 'input number>'.
При виконанні read лише аналізуються символи, накопичені у внутрішньому буфері за виконання виклику eof. Якщо вони утворюють сталу, то відповідне значення присвоюється змінній V, після чого повторюється виклик eof тощо. Отже, введення символів із клавіатури в такому циклі відбувається за викликів eof, а не read! Таким чином, щоб запрошення друкувалося до початку введення першої сталої, варто перед циклом додати виклик write('input number>').
Ще раз повернемося до уживання процедури readln замість read. Якщо при виконанні наведеного циклу за черговою сталою після пропуску випадково набрати непорожні символи, що не задають сталу, то вони залишаться у внутрішньому буфері. Далі з виклику eof повернеться false, і аналіз цих символів за виконання read призведе до аварійного завершення програми. Якщо ж замість read записати readln, то після обробки сталої ці символи пропускаються, тому що набираються перед Enter, і програма виконується нормально.
15.4. Тип безтипових файлів
Розглянемо програму посимвольного копіювання файлів:
program StupidCopy;
var f, g : file of char; c : char; s : string;
begin
writeln('Задайте ім'я початкового файла');
readln(s); assign(f, s);
writeln('Задайте ім'я цільового файла');
readln(s); assign(g, s);
reset(f); rewrite(g);
while not eof(f) do
begin
read(f, c); write(g, c);
end;
close(f); close(g);
end.
Здається, що при виконанні цієї простенької програмки все гаразд, оскільки за рахунок використання буферів фізичні файли читаються-записуються порціями по кілька блоків, пристрої при цьому працюють найкращим чином, а переміщення інформації відбуваються головним чином усередині оперативної пам’ яті, тобто швидко.
Спробуйте запустити її на виконання, указавши вхідним файл розміром у кілька сотень кілобайтів – виконання займе секунди й десятки секунд. Напрошується висновок, що при її виконанні дещо здійснюється не найкращим чином. Розглянемо один із способів прискорення роботи з файлами.
Система Турбо Паскаль дозволяє створити додатковий власний буфер і власноруч описати його застосування. Це виявляється набагато ефективнішим від використання буферів, що забезпечуються системою. А реалізується це за допомогою безтипових файлів.
Тип безтипових файлів задається словом file. Файлову змінну цього типу, як і всіх інших файлових типів, треба спочатку зв’ язати з фізичним файлом і відкрити, установивши в початковий стан для читання чи запису. Процедури відкривання RESET і REWRITE тут мають по 2 параметри. Крім імені файлової змінної, у їх виклику вказується розмір "зовнішнього буфера" в байтах. Цей буфер ще називається блоком і явно в Паскаль-програмі не позначається. Через нього дані копіюються з фізичного файла до "внутрішнього буфера". Розмір блока може бути в межах від 1 до 65535. Як не дивно, найкраще встановити його рівним 1:
ReSet(f, 1) або ReWrite(g, 1).
Чому саме так, ми скажемо далі.
The online video editor trusted by teams to make professional video in
minutes
© Referats, Inc · All rights reserved 2021