Різниця між write та writeLn
Якщо write залишає курсор у поточному рядку, то writeLn після виведення переходить на новий. Ця дрібниця сильно впливає на формат результату.
Ключові відмінності write і writeLn
- Перенесення рядка:
writeзалишає курсор після виведеного тексту,writeLnпереходить нижче. - Кілька значень: обидві процедури можуть виводити кілька аргументів одним викликом.
- Порожній виклик:
writeLn;створює порожній рядок, аwrite;без аргументів не має такого призначення. - Форматування: обидві процедури підтримують числові формати на кшталт
:8:2. - Консоль: без файлового параметра результат іде у стандартний вивід програми.
- Файли: обидві процедури можуть записувати текст у файлову змінну.
- Типове призначення:
writeзручний для складання одного рядка,writeLn– для завершення рядка. - Результат: різниця часто помітна вже на другому виклику процедури.
Що таке write у Pascal
write виводить передані значення у стандартний вивід або текстовий файл. Після завершення процедури курсор залишається одразу після останнього символу, тому наступний write продовжить той самий рядок.
Наприклад:
begin
write('Ім'я: ');
write('Олександр');
end.
Результат:
Ім'я: Олександр
Тепер додамо ще один виклик:
begin
write('Ім'я: ');
write('Олександр');
write(' Вік: ');
write(35);
end.
Отримаємо:
Ім'я: Олександр Вік: 35
Саме ця властивість робить write зручним для складання рядка частинами. Документація Free Pascal прямо описує Write як процедуру, яка виводить змінні у текстовий файл або стандартний вивід.
“Write виводить вміст змінних у файл або стандартний вивід.” – документація Free Pascal, переклад українською.
Це добре пояснює головну роль процедури: вона друкує дані, але сама по собі не завершує рядок.
⚡ Цікавий факт! write може приймати кілька аргументів, тому write('Сума: ', 1250, ' грн'); виведе все одним викликом.
Що таке writeLn у Pascal
writeLn робить те саме базове виведення, але після нього додає послідовність переходу на новий рядок. Тому наступний текст починається вже з нового рядка.
Приклад:
begin
writeLn('Олександр');
writeLn(35);
end.
Результат:
Олександр
35
У документації Free Pascal ця різниця сформульована прямо:
“WriteLn робить те саме, що Write, а після цього додає символи переходу на новий рядок.” – документація Free Pascal, переклад українською.
Є ще одна корисна особливість. Виклик writeLn; без аргументів просто створює новий рядок. Наприклад:
writeLn('Результати:');
writeLn;
writeLn('Готово');
На екрані з’явиться порожній рядок між двома повідомленнями.
Порівняння write та writeLn
| Ознака | write |
writeLn |
|---|---|---|
| Виведення тексту | Так | Так |
| Виведення чисел | Так | Так |
| Перехід на новий рядок | Ні | Так |
| Кілька аргументів | Так | Так |
| Порожній виклик | Не для перенесення | Створює новий рядок |
| Запис у текстовий файл | Так | Так |
| Формат числа | Підтримується | Підтримується |
Наступний write |
Продовжує рядок | Починає новий рядок |
| Типовий сценарій | Складання рядка | Завершення рядка |
Типові помилки під час виведення
- Очікувати автоматичного перенесення після
write→ наступний текст приєднається до попереднього, навіть якщо програміст візуально очікував новий рядок. - Плутати
writeLnз окремою системою форматування → процедура виводить дані так само, якwrite, а її головна додаткова дія – перехід на новий рядок. - Ставити
writeLnпісля кожного фрагмента → один логічний рядок розпадеться на кілька фізичних рядків. - Забувати про
writeLn;→ для порожнього рядка не потрібно передавати порожній текст. - Не перевіряти результат кількох
write→ пробіли між аргументами не додаються автоматично. - Плутати
writeLnізReadLn→ перша процедура виводить дані, друга працює з введенням.
Детальні відмінності write та writeLn
Як змінюється позиція курсора
Уявімо програму, яка формує простий чек:
write('Товар: ');
write('Хліб');
writeLn;
write('Ціна: ');
writeLn(35);
Перші два виклики створюють один рядок. writeLn після них переносить курсор, а останній виклик уже виводить число й одразу завершує другий рядок.
Мій досвід із навчальними прикладами Pascal підказує просте правило: якщо наступний фрагмент має стояти поруч – потрібен write; якщо нижче – writeLn.
Чому пробіли треба додавати самому
Команди write і writeLn не вставляють пробіл між аргументами автоматично. Тому:
write('Вік:', 35);
дасть:
Вік:35
А варіант
write('Вік: ', 35);
дасть:
Вік: 35
Для навчання це дрібниця, яка швидко стає причиною дивного форматування.
💡 Важливий момент! writeLn('A', 'B', 'C'); створить ABC і лише після цього перейде на новий рядок. Між аргументами автоматичних роздільників немає.
Форматування чисел працює в обох процедурах
Pascal дозволяє задавати ширину поля та кількість знаків після десяткової крапки. Наприклад:
writeLn(12.5:8:2);
Число буде виведене з шириною поля щонайменше 8 символів і двома десятковими знаками.
Це корисно для таблиць. Якщо треба вивести 10 значень одне під одним, задана ширина допоможе тримати колонки рівно.
Запис у файл має ту саму логіку
Різниця між процедурами зберігається і під час запису в текстовий файл. write додає дані в поточну позицію, а writeLn після них додає перехід рядка.
Тому файл із таким кодом:
write(F, 'Іван');
writeLn(F, ' 35');
write(F, 'Київ');
матиме два рядки:
Іван 35
Київ
🔍 До речі! У Free Pascal для перенесення рядка використовується системне значення slinebreak, тому конкретна послідовність символів може залежати від середовища.
Що обрати для конкретної задачі
- Формуєте один рядок частинами → беріть
write. Якщо поставитиwriteLnпісля кожного фрагмента, інформація розійдеться по різних рядках. - Кожне значення має бути на новому рядку → беріть
writeLn. Інакше доведеться окремо додавати перенесення після кожного набору даних. - Створюєте таблицю або звіт → комбінуйте обидві процедури.
writeзручно залишає заголовки в одному рядку, аwriteLnзавершує готовий рядок.
🚨 Зверніть увагу! Для навчального коду різниця між write і writeLn особливо добре помітна на прикладі 2-3 послідовних команд: одна команда змінює позицію курсора, інша – ні.
Висновок+контрольний список для Pascal
writeвиводить дані й залишає курсор після останнього символу. Наступний виклик продовжить той самий рядок.writeLnспочатку виводить дані, а потім переводить курсор на наступний рядок. Саме словоLnпідказує логіку команди.- Для складання одного повідомлення частинами зручніше писати кілька
write. Так легше контролювати пробіли між фрагментами. - Для списку значень по одному в кожному рядку зручніший
writeLn. Кожен виклик одразу завершує поточний рядок. writeLn;без параметрів створює порожній рядок. Такий прийом зручний для візуального поділу блоків результату.- Обидві процедури приймають кілька аргументів.
writeLn('Сума: ', 250);виведе напис і число, після чого перейде нижче. - Обидві процедури можуть працювати з текстовими файлами. Різниця в переході рядка залишається такою самою, як і під час роботи з консоллю.
- Якщо результат програми “злипається”, спочатку перевірте місця, де мав бути
writeLn. У більшості простих навчальних програм проблема саме там.
Відповідаю на часті запитання
Чому write не переносить текст на новий рядок у Pascal?
Я сприймаю write як “надрукувати тут і залишитися”. Процедура навмисно не завершує рядок, тому наступний виклик продовжує виведення з поточної позиції. Для перенесення потрібен writeLn.
Що означає Ln у назві writeLn?
Ln походить від слова “line” – рядок. Для новачка це зручна підказка: writeLn завершує поточний рядок після виведення, тому наступні дані з’являться нижче.
Чи можна замінити writeLn на write у програмі Pascal?
Можна, якщо після цього вам не потрібен автоматичний перехід. Я б не робив так у коді, де формат виводу має значення: доведеться окремо організовувати перенесення, і шанс помилки зростає.
Що краще вчити новачку: write чи writeLn?
Я радив би вивчити їх одразу разом. Спробуйте три рядки: write('A'); write('B'); writeLn('C'); – результат одразу покаже, хто відповідає за продовження, а хто за завершення рядка.

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