- •1.1 Перші кроки
- •1.2 Змінні й арифметичні вирази
- •1.3 Твердження for
- •1.4 Символічні константи
- •1.5 Ввід і вивід знаків
- •1.5.1 Копіювання файла
- •1.5.2 Відлік символів
- •1.5.3 Відлік рядків
- •1.6 Масиви
- •1.7 Функції
- •1.8 Аргументи - виклик за значенням
- •1.9 Символьні масиви
- •1.10 Зовнішні змінні й область дії
- •2.1 Назви змінних
- •2.2 Типи даних і розміри
- •2.3 Константи
- •2.4 Оголошення
- •2.5 Арифметичні операції
- •2.6 Реляційні та логічні оператори
- •2.7 Перетворення типів
- •2.8 Оператори приросту та спаду
- •2.9 Розрядні оператори
- •2.10 Оператори та вирази присвоєння
- •2.11 Вирази умов
- •2.12 Пріоритет і послідовність обчислення
- •3.1 Вирази та блоки
- •3.3 Else if
- •3.4 Switch
- •3.5 Цикли while та for
- •3.6 Цикли do-while
- •3.7 Break і continue
- •3.8 Goto та мітки
- •4.1 Основні знання про функції
- •4.2 Функції, які не повертають цілих
- •4.3 Зовнішні змінні
- •4.4 Правила області дії
- •4.5 Файли заголовка
- •4.6 Статичні змінні
- •4.7 Регістрові змінні
- •4.8 Структура блоків
- •4.10 Рекурсія
- •4.11 Препроцесор c
- •4.11.1 Включення файлів
- •4.11.2 Заміна макросів
- •4.11.3 Обумовлене включення файлів
- •5.1 Покажчики й адреси
- •5.2 Покажчики й аргументи функцій
- •5.3 Покажчики та масиви
- •5.4 Арифметика адрес
- •5.5 Покажчики на символи та функції
- •5.6 Масив покажчиків; покажчики на покажчики
- •5.7 Багатовимірні масиви
- •5.8 Ініціалізація масиву покажчиків
- •5.9 Покажчики в порівнянні з багатовимірними масивами
- •5.10 Аргументи командного рядка
- •5.11 Покажчики на функції
- •5.12 Складні оголошення
- •6.1 Основні поняття про структури
- •6.2 Структури та функції
- •6.3 Масиви структур
- •6.4 Покажчики на структури
- •6.5 Структури зі зворотнім звертанням
- •6.6 Пошук по таблиці
- •6.7 Typedef
- •6.8 Сполуки
- •6.9 Розрядні поля
- •7.1 Стандартний ввід і вивід
- •7.2 Форматований вивід - printf
- •7.3 Списки аргументів довільної довжини
- •7.4 Форматований ввід - scanf
- •7.5 Доступ до файлів
- •7.6 Обробка помилок - stderr і exit
- •7.7 Ввід і вивід рядків
- •7.8 Додаткові функції
- •7.8.1 Операції з ланцюжками
- •7.8.2 Перевірка і перетворення класів символів
- •7.8.3 Ungetc
- •7.8.4 Виконання команд
- •7.8.5 Керування пам'яттю
- •7.8.6 Математичні функції
- •7.8.7 Генератор випадкових чисел
- •8.1 Дескриптори файлів
- •8.2 Низькорівневий ввід/вивід - read і write
- •8.3 Open, creat, close, unlink
- •8.4 Довільний доступ - lseek
- •8.5 Приклад: втілення fopen і getc
- •8.6 Приклад - перелік вмісту каталогів
- •8.7 Приклад - розподільник пам'яті
7.1 Стандартний ввід і вивід
Як ми зазначили в Розділі 1, бібліотека втілює просту модель текстового вводу і виводу. Текстовий потік складається з послідовності рядків, кожний рядок закінчується знаком нового рядка. Якщо система не працює в такий спосіб, бібліотека зробить все від неї залежне, щоб здавалося, що все саме так і є. Наприклад, бібліотека може перетворювати повернення каретки і переведення рядка на символ нового рядка при вводі і в зворотньому напрямку при виводі.
Найпростіший механізм вводу — це читати по одному символу за один раз зі стандартного вводу, як правило це клавіатура, за допомогою getchar:
int getchar(void)
getchar повертає неступний введений знак кожний раз як її викликано, або EOF, коли вона зіткнулася з кінцем файла. Символічну константу EOF визначено в <stdio.h>. Це значення, типово, дорівнює -1, але краще вживати EOF, щоб не залежати від певного значення. В багатьох середовищах, клавіатуру можна замінити на файл скориставшись з умовного знака <, який позначає перенаправлення вводу: якщо програма prog послуговується getchar, тоді команда
prog <infile
змушує prog читати символи з infile, натомість. Перемкнення вводу відбувається в такий спосіб, що сама програма prog знає про зміну; зокрема, ланцюжок «<infile» не включається як аргумент командного рядка в argv. Заміна вводу також залишається невидимою, якщо ввід надходить з іншої програми через конвеєр: на деяких системах, команда
otherprog | prog
запускає дві програми, otherprog і prog, і передає через конвеєр стандартний вивідotherprog стандартному вводу prog.
Функція
int putchar(int)
використовується для виводу: putchar(c) виводить символ c на стандартний вивід, типово, це екран. putchar повертає виведений символ, або EOF, якщо відбулася помилка. Знову ж таки, вивід можна перенаправити у файл за допомогою >filename. Якщо програма використовуєputchar, команда
prog >outfile
запише стандартний вивід до outfile, натомість. Якщо підтримуються конвеєри,
prog | anotherprog
поміщає стандартний вивід prog у стандартний ввід anotherprog. Вивід, спричиненийprintf, також знаходить свій шлях до стандартного пристрою виводу. Виклики putchar іprintf можуть чергуватися — вивід відбувається в тій послідовності, в якій виклики відбуваються.
Кожний вихідний файл, що згадує якусь з функцій бібліотеки вводу/виводу, повинен містити рядок
#include <stdio.h>
перед тим як їх вживати. Коли назву файла заголовка включено в дужки < та >, пошук такого відбувається в стандартному наборі місць в системі (наприклад, на UNIX, типовим каталогом є/usr/include).
Багато програм читають тільки один потік вводу і записують тільки один виводу; для таких програм буде цілком додстатньо здійснення вводу і виводу за допомогою getchar, putchar іprintf, або, принаймні, цього вистачить для початку. Це особливо так, якщо перенаправлення використовується для під'єднання виводу однієї програми до вводу іншої. Наприклад, розглянемо програму lower, яка переводить свій ввід у нижній регістр:
#include <stdio.h>
#include <ctype.h>
main() /* lower: переводить ввід у нижній регістр */
{
int c
while ((c = getchar()) != EOF)
putchar(tolower(c));
return 0;
}
Функцію tolower визначено в <ctype.h>, вона перетворює літеру верхнього регістру у нижній і повертає решту символів незмінними. Як ми зазначили раніше, «функції» на зразокgetchar і putchar з <stdio.h> і tolower з <ctype.h> часто являються макросами, щоб запобігти витраті ресурсів на виклик функції для кожного символу. Ми покажемо як здійснити це в Розділі 8.5. Незалежно від того, як втілено функції <ctype.h> на окремих машинах, програми, що використовують їх, не вимушені знати деталей про набір символів.
Вправа 7-1. Напишіть програму, яка би перетворювала літери верхнього регістру на нижній або нижнього на верхній в залежності від того, за яким ім'ям її було викликано, на що вказуватимеargv[0].
