\ n"); while ((c = getchar ())! = eof) putchar (c); Введення символу ми внесли в заголовну частину while. оскільки з = getchar ()) -" />

Програма копіювання символьного файлу

printf ( "Make input> \ n"); while ((c = getchar ())! = eof) putchar (c);

Введення символу ми внесли в заголовну частину while. оскільки з = getchar ()) - це вираз того ж типу, що і c. Оператор while в загальному випадку працює так: він спочатку обчислює вираз, яке знаходиться в його головній частині, при цьому виконується введення символу з клавіатури, що нам і потрібно. Потім оператор while перевіряє, чи не є введені символи ознакою кінця файлу. Так як на відміну від попереднього варіанту тіло оператора while складається тільки з одного оператора putchar (c). то фігурні дужки можна опустити. Після того як виконається putchar (c). управління буде передано в заголовну частину оператора while. де знову почнеться обчислення виразу, яке, в свою чергу, потребують введення символу з клавіатури і т. д.

Підрахунок символів в файлі. Варіант 1

Напишемо програму, в якій файл буде вводитися з клавіатури. Вид програми представлений в лістингу 2.3.

printf ( "Make input> \ n"); while (getchar ()! = eof) nc ++;

printf ( "Characters's number is:% ld \ n", nc); _getch ();

Тут ми зустрічаємося з новим типом даних: long - довге ціле. Цей тип (можна і long int) застосовується для опису великих цілих чисел зі знаком. За займаної пам'яті цей тип змінних більше або дорівнює типу int. Змінні типу long можуть оголошуватися як signed long або unsigned long. У першому випадку у змінної буде присутній знак, у другому - знак буде пригнічений. Це означає в обох випадках, що знаковий розряд числа з кваліфікаторів unsigned буде розглядатися компілятором як звичайний розряд даних, т. Е. Стане учасником операцій поряд з іншими розрядами даних.

signed long - це синонім long. Існує також тип даних long long. Мінлива цього типу займає пам'ять більше, ніж unsigned long. Змінні типу long long можуть бути зі знаком або без знаку. Відповідно вони об'явля-

ються як signed long long і unsigned long long. signed long long - це синонім long long.

Так як ми підраховуємо кількість символів в файлі, який (в загальному випадку) може бути і не "клавіатурним", то повинні бути готові до того, що в ньому буде багато символів, і їх число перевищить допустиме значення, що міститься у змінній типу int. Кількість символів, що вводять підраховується в змінної nc типу long за правилом: ввели один символ - значення nc збільшується на одиницю, ввели ще один - знову nc збільшується на одиницю і т. Д. На початку кожного виконання програми значення nc обнуляється.

Далі відбувається запит на введення символів (текст виводиться на екран). Потім знову за допомогою циклу while організовується введення символів до тих пір, поки не буде натиснута комбінація клавіш +. Зауважимо, що тіло оператора while (як і в попередньому прикладі) містить тільки один вислів, тому фігурні дужки, що обмежують тіло оператора, зайві. Оскільки тіло оператора становить функція getchar (). то коли оператор while почне обчислювати вираз, знадобиться введення символу з клавіатури. Після того як ми введемо символ, значення getchar () стане рівним коду введеного символу: ця функція завжди видає код символу, який ми натискаємо на клавіатурі. Тому немає необхідності значення getchar () ще привласнювати будь-якої змінної, тим більше що сам введен-

Програма копіювання символьного файлу

44 Частина I. Вивчення мови С / С ++

ний символ на нашу алгоритму не потрібно - значення getchar () відразу порівнюється з ознакою кінця файлу. Якщо ця ознака ще не введений (ми не натиснули комбінацію клавіш +), То умова виконання оператора while не порушується, і тіло оператора while. що складається всього з одного оператора nc ++. починає виконуватися знову.

Новий оператор nc ++ рівносильний висловом nc = nc + 1 (т. Е. До значення nc додається одиниця). До речі, можна в даному випадку писати і ++ nc. поки операція ++ не бере участі в вираженні типу int x = nc ++ або int x = ++ nc. це не має жодного значення. В останніх же випадках положення символів ++ істотно: якщо вони знаходяться до nc. то спочатку операція виконується, а потім вже результат присвоюється змінної x. Якщо знаходяться після nc. то спочатку вміст nc присвоюється змінної x. а потім вже nc змінюється на одиницю. Цієї операції споріднена операція -. яка поводиться як і ++. але не додає, а віднімає одиницю.

У функції printf () ми знову бачимо новий формат:% ld. З цього формату виводяться числа типу long.

Результат роботи програми наведено на рис. 2.2. Зауважимо, що в підрахунку символів бере участь і символ комбінації клавіш +, і символ, який вводиться як ознака кінця введення. Тому результат - кількість введених символів - буде на одиницю більше, що і видно з малюнка. Щоб цього не відбувалося, в програмі перед її завершенням з nc треба було б відняти одиницю, але тоді це було б не наочно для того, хто навчається.

Мал. 2.2. Результат роботи програми лістингу 2.3

Підрахунок символів в файлі. Варіант 2

Змінимо кілька попередню програму, застосувавши новий оператор і нову операцію (див. По тексту). Програма буде виглядати, як показано в лістингу 2.4.