Різниця між readLn та read
У Pascal команди read і readLn обидві зчитують дані, але по-різному поводяться з позицією введення. Саме ця дрібниця часто спричиняє помилки під час роботи з кількома значеннями.
Ключові відмінності read та readLn
- Перехід рядка:
readзалишає курсор після прочитаного значення;readLnпереходить на наступний рядок. - Кількість введень:
readможе послідовно брати кілька значень з одного рядка;readLnзавершує читання поточного рядка. - Тип даних: обидві команди можуть читати числа, символи та рядки залежно від реалізації Pascal.
- Залишок рядка:
readзалишає непрочитані дані;readLnпісля читання пропускає залишок поточного рядка. - Типовий сценарій:
readзручний для послідовного введення;readLnчасто застосовують для окремого рядка. - Взаємодія: комбінація
readіreadLnможе дати несподіваний результат, якщо не врахувати залишок введення. - Початківці: помилки частіше виникають саме через неправильне очікування переходу на новий рядок.
- Синтаксис: базовий запис простий –
read(a)абоreadLn(a).
Що таке процедура read
read – стандартна процедура Pascal для введення значення з потоку. Вона читає потрібні дані, але не примушує введення перейти на наступний рядок.
Наприклад:
var
a, b: Integer;
begin
read(a, b);
end.
Якщо користувач введе:
10 20
змінна a отримає 10, а b – 20. Обидва значення можуть бути прочитані одним викликом.
Але після read(a) позиція введення залишиться після прочитаного значення. Саме тому наступний виклик read може взяти наступне доступне значення з того самого рядка або перейти до наступного, якщо воно розташоване там.
⚡ Цікавий факт! Назви read і readLn відображають їхню головну різницю: суфікс Ln походить від слова “line”, тобто “рядок”.
Що таке процедура readLn
readLn теж читає дані, але після завершення операції переходить до наступного рядка введення. Якщо після потрібного значення залишилися символи або інші дані, вони більше не будуть доступні наступним читанням із цього самого рядка.
Наприклад:
var
a: Integer;
begin
readLn(a);
end.
Після введення 25 процедура завершує роботу з поточним рядком. Наступний readLn чекатиме введення вже з нового рядка.
“ReadLn reads a line from the input file and advances to the next line.” – документація Free Pascal, переклад українською.
Тому readLn часто зручний у навчальних програмах, де користувач вводить одну відповідь за один рядок.
Порівняння read та readLn у Pascal
| Ознака | read |
readLn |
|---|---|---|
| Зчитування | Читає потрібні значення | Читає значення та завершує рядок |
| Перехід рядка | Не переходить автоматично | Переходить |
| Залишок рядка | Може залишитися | Пропускається |
| Кілька значень | Зручно читати послідовно | Можна читати кілька за один виклик |
| Наступний виклик | Продовжує з поточної позиції | Починає з наступного рядка |
| Основна роль | Потокове введення | Введення рядками |
| Типова помилка | Забутий залишок введення | Неочікуване пропускання даних |
| Приклад | read(a, b) |
readLn(a, b) |
| Pascal | Стандартна процедура | Стандартна процедура |
Поширені помилки під час введення
- Очікування переходу рядка після read →
read(a)не завершує поточний рядок. Наступна операція може продовжити читання з тієї самої позиції. - Змішування read і readLn → після
readу потоці можуть залишитися символи поточного рядка. НаступнийreadLnзавершить цей рядок, що іноді виглядає як пропуск введення. - Неправильне трактування пробілів → для числового введення пробіли та переходи рядка зазвичай розглядаються як роздільники. Поведінка для
CharіStringмає свої нюанси. - Спроба прочитати рядок через read → для повного рядка
readLnзазвичай зрозуміліший варіант.readпрацює за іншими правилами залежно від типу змінної. - Зайві readLn → додатковий виклик може завершити порожній або залишковий рядок. Через це програма інколи переходить далі без очікуваного введення.
Детальні відмінності read та readLn
Як працює залишок введення
Уявімо введення 15 30 і команду read(a). Після отримання 15 значення 30 залишається доступним для наступного читання.
Якщо замість цього виконати readLn(a), процедура завершує поточний рядок після читання 15. Значення 30 із цього рядка вже не буде прочитане наступним оператором.
Чому виникає “пропуск” введення
Типовий приклад у Pascal:
read(age);
readLn(name);
Якщо age вводиться числом, після нього користувач натискає Enter. readLn(name) може спершу завершити залишок поточного рядка, а програміст очікує введення імені.
Я помічав, що саме ця конструкція часто створює найбільше питань у навчальних прикладах Pascal.
Коли зручніше читати кілька чисел
Для задачі, де потрібно ввести три числа в одному рядку, можна написати:
read(a, b, c);
Наприклад, рядок 10 20 30 буде розібраний на три значення. Це зручно для математичних задач і конкурсного програмування.
Що змінюється для символів
З Char ситуація цікавіша. Окремий символ може читатися інакше, ніж число, оскільки пробіл теж є символом.
Тому конструкція на кшталт read(ch) може отримати саме символ із потоку, а не “наступне слово”. Тут уже треба дивитися на тип змінної, а не лише на назву процедури.
💡 Важливий момент! read і readLn не є двома різними способами перетворення тексту на число. Обидві процедури працюють із потоком введення, а різниця стосується його поточної позиції та завершення рядка.
Чому це важливо для навчальних задач
У невеликій програмі різниця може здатися дрібницею. Але коли програма читає 5-10 значень різних типів, неправильне поєднання процедур швидко дає помилку.
Наприклад, програма може спочатку прочитати число, потім символ, а після нього рядок. Якщо не контролювати межі рядків, отриманий результат відрізнятиметься від очікуваного.
🚨 До речі! У Free Pascal процедура readln без параметрів теж має практичний сенс: вона пропускає залишок поточного рядка та переходить до наступного.
Що обрати для конкретної задачі
- Кілька чисел поспіль: використовуйте
read(a, b, c), якщо значення потрібно отримати з потоку без примусового завершення рядка. Інакше зайвийreadLnможе перервати послідовне введення. - Одне значення на рядок:
readLn(a)зручний для навчальних програм і простих діалогів. Кожна наступна команда працюватиме вже з наступним рядком. - Число після текстового введення: перевірте, де залишився символ нового рядка. Інакше наступне читання рядка може завершитися раніше, ніж користувач встигне щось ввести.
🔍 Зверніть увагу! У сучасних реалізаціях Pascal є відмінності між діалектами мови, тому для конкретного компілятора варто перевіряти його документацію. Правила Free Pascal, Delphi та старих навчальних середовищ можуть мати нюанси.
Висновок+контрольний список для Pascal
- Потрібно продовжити читання: обирайте
read, якщо наступні дані можуть бути в тому самому рядку. Це особливо зручно для кількох числових параметрів. - Потрібен новий рядок: обирайте
readLn, коли поточний рядок після введення більше не потрібен. Наступне читання почнеться вже з нового рядка. - Читаєте кілька чисел:
read(a, b, c)дає змогу отримати три значення послідовно. Наприклад,5 8 13буде розподілено між трьома змінними. - Працюєте з рядками:
readLnзазвичай краще відповідає моделі “один рядок – одна відповідь”. Це робить код зрозумілішим у простих консольних програмах. - Змішуєте процедури: після
readперевіряйте, що залишилося у потоці. Саме тут часто виникає ефект “програма пропустила введення”. - Читаєте Char: перевіряйте пробіли та символ нового рядка. Для символьного введення правила відрізняються від читання числових значень.
- Пишете навчальну програму: не змішуйте
readіreadLnвипадково. Спочатку визначте, чи працює програма зі значеннями або з цілими рядками. - Працюєте з конкретним Pascal: перевірте документацію компілятора. Free Pascal і Delphi можуть мати власні нюанси щодо введення та типів.
Відповідаю на часті запитання
Чому readLn пропускає введення в Pascal?
Я насамперед перевірив би попередній read. Якщо він залишив у потоці символ кінця рядка, наступний readLn може одразу завершитися, створюючи враження, ніби програма проігнорувала введення.
Чи можна замінити read на readLn у програмі Pascal?
Можна, але результат може змінитися, якщо програма читає кілька значень із одного рядка. Я б не робив механічну заміну: спершу перевірив би, де саме програма повинна переходити на новий рядок.
Що краще використовувати для введення чисел у Pascal?
Для кількох чисел поспіль мені зручніший read(a, b, c), особливо у навчальних задачах. Якщо кожне число вводиться окремим рядком, readLn робить структуру програми зрозумілішою.
Як правильно поєднати read і readLn у Pascal?
Зазвичай спочатку визначають межі введення: які дані належать одному рядку, а які мають читатися далі. Я б окремо протестував сценарій із Enter після кожного значення, бо саме тут найчастіше проявляється помилка.

Ентузіаст україномовного інтернету. Пишу статті на різні тематики. Копірайтер з 15-річним стажем. Головний редактор сайту difference.in.ua.