русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Копіювання файла


Дата додавання: 2014-11-28; переглядів: 810.


Маючи getchar і putchar ви можете написати дивовижну кількість корисного коду, не знаючи більше нічого про ввід і вивід. Найпростіший приклад — це програма, що копіює свій ввід до власного виводу по одному знаку за раз:

прочитати знак
while (знак не є вказівником кінця файла)

вивести щойно прочитаний знак
прочитати наступний знак

Переклад цього у C дасть нам:

#include <stdio.h>

 

/* копіює ввід до виводу; 1-а версія */

main()

{

int c;

 

c = getchar();

while (c != EOF) {

putchar(c);

c = getchar();

}

}

Порівнювальний оператор != означає «не дорівнює».

Те, що здається знаком на клавіатурі або екрані, звичайно як і все інше, зберігається внутрішньо, як послідовність бітів. Тип char спеціально призначений для зберігання таких знакових даних, хоча для цього можна використати будь-який тип цілого. Ми скористалися int з тонких але важливих міркувань.

Проблема полягає у відокремленні кінця вводу від чинних даних. Розв'язання її пов'язане з фактом, що getchar повертає відмінне значення, коли немає більше вводу — значення, яке не можна плутати з якимось дійсним знаком. Воно називається EOF, що походить від «end of file». Ми повинні оголосити c такого типу, який би був досить великим для збереження будь-якого значення, поверненого getchar. Ми не можемо скористатися char, оскільки c повинна бути досить місткою, щоб втримати EOF, окрім звичайних символів. Саме тому, ми вдалися до int.

EOF — це ціле, визначене в <stdio.h>. Його типова величина не настільки важлива, доки вона не збігається зі значенням якогось знака. Використовуючи символічну константу EOF, ми також переконуємося, що нічого в програмі не залежить від певного числового значення.

У досвідчених програмістів, програма копіювання виглядатиме стисліше. В мові C, будь-яке присвоєння на кшталт

c = getchar();

є виразом і має значення, що дорівнюватиме значенню з лівого боку після присвоєння. Це означає, що присвоєння може з'являтися як частина більшого виразу. Якщо присвоєння символу змінній c помістити в тестову частину циклу while, програму копіювання можна написати так:

#include <stdio.h>

 

/* копіює ввід до виводу; 2-а версія */

main()

{

int c;

 

while ((c = getchar()) != EOF)

putchar(c);

}

Цикл while добуває символ, присвоює його c, потім перевіряє, чи цей символ не був вказівником кінця файла. Якщо ні, виконується корпус while, виводячи символ. Після цьогоwhile повторюється. По досягненню кінця вводу, while завершується; так само main.

Ця версія централізує ввід — існує тільки одне посилання на getchar, і це робить програму стислішою. Отримана в результаті програма, компактніша і, як тільки ви оволодієте ідіомою, легше читається. Ви часто зустрінете цей стиль. (Існує проте небезпека захопитися, і створити непроникний для розуміння код; ми намагатимемось уникати цієї тенденції.)

Дужки навколо присвоєння всередині умови обов'язкові. != має більший пріоритет за =, що означає, що за відсутності дужок порівняльна перевірка != відбулася би до присвоєння. Тож, вираз

c = getchar() != EOF

рівнозначний

c = (getchar() != EOF)

Останнє призводить до небажаного ефекту присвоєння c значень 0 або 1, залежно від того, чи повернув виклик getchar кінець файла, чи ні. (Більше про це можна знайти в Розділі 2.)

Вправа 1-6. Перевірте, чи вираз getchar() != EOF дорівнює 0 або 1.

Вправа 1-7. Напишіть програму, яка би виводила значення EOF.


<== попередня лекція | наступна лекція ==>
Ввід і вивід знаків | Відлік символів


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн