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 організовується введення символів до тих пір, поки не буде натиснута комбінація клавіш
44 Частина I. Вивчення мови С / С ++
ний символ на нашу алгоритму не потрібно - значення getchar () відразу порівнюється з ознакою кінця файлу. Якщо ця ознака ще не введений (ми не натиснули комбінацію клавіш
Новий оператор nc ++ рівносильний висловом nc = nc + 1 (т. Е. До значення nc додається одиниця). До речі, можна в даному випадку писати і ++ nc. поки операція ++ не бере участі в вираженні типу int x = nc ++ або int x = ++ nc. це не має жодного значення. В останніх же випадках положення символів ++ істотно: якщо вони знаходяться до nc. то спочатку операція виконується, а потім вже результат присвоюється змінної x. Якщо знаходяться після nc. то спочатку вміст nc присвоюється змінної x. а потім вже nc змінюється на одиницю. Цієї операції споріднена операція -. яка поводиться як і ++. але не додає, а віднімає одиницю.
У функції printf () ми знову бачимо новий формат:% ld. З цього формату виводяться числа типу long.
Результат роботи програми наведено на рис. 2.2. Зауважимо, що в підрахунку символів бере участь і символ комбінації клавіш
Мал. 2.2. Результат роботи програми лістингу 2.3
Підрахунок символів в файлі. Варіант 2
Змінимо кілька попередню програму, застосувавши новий оператор і нову операцію (див. По тексту). Програма буде виглядати, як показано в лістингу 2.4.