- •Происхождение языка с
 - •Язык среднего уровня
 - •Структурированный язык
 - •Язык программирования
 - •Компиляторы против интерпретаторов
 - •Вид программ на с
 - •Библиотеки и компоновка
 - •Раздельная компиляция
 - •Карта памяти с-программы
 - •Переменные, константы, операторы и выражения
 - •Идентификаторы
 - •Типы данных
 - •Модификаторы типов
 - •Модификаторы доступа
 - •Объявление переменных
 - •Локальные переменные
 - •Формальные параметры
 - •Глобальные переменные
 - •Спецификаторы хранения
 - •Статические переменные
 - •Статические локальные переменные
 - •Статические глобальные переменные
 - •Регистровые переменные
 - •Оператор присваивания
 - •Многочисленное присваивание
 - •Преобразование типов при присваивании
 - •Инициализация переменных
 - •Константы
 - •Символьные константы с обратным слэшем
 - •Операторы
 - •Арифметические операторы
 - •Увеличение и уменьшение
 - •Операторы отношения и логические операторы
 - •Битовые операторы
 - •Оператор ?
 - •Операторы указания & и *
 - •Оператор sizeof
 - •Оператор «запятая»
 - •Операторы [ ] u ()
 - •Приоритеты в с
 - •Выражения
 - •Преобразование типов в выражениях
 - •Принудительные преобразования
 - •Пробелы и круглые скобки
 - •Сокращенные операторы в с
 - •Операторы управления программой
 - •Истина и ложь в с
 - •Операторы выбора
 - •Вложенные if
 - •Лесенка if-else-if
 - •Оператор ?
 - •Вложенные операторы switch
 - •Вариации цикла for
 - •Бесконечный цикл
 - •Циклы for без тела
 - •Метки и goto
 - •Функции
 - •Оператор return
 - •Выход из функции
 - •Возвращаемые значения
 - •Значения, возвращаемые функцией main()
 - •Правила видимости для функций
 - •Аргументы функции
 - •Передача по значению и передача по ссылке
 - •Создание передачи по ссылке
 - •Передача массивов в функции
 - •Аргументы функции main()
 - •Функции, возвращающие нецелые значения
 - •Использование прототипов функции
 - •Прототипы стандартных библиотечных функций
 - •Создание прототипов функций, не имеющих параметров
 - •Возврат указателей
 - •Рекурсия
 - •Сопоставление классического и современного объявления параметров
 - •Указатели на функции
 - •Особенности реализации
 - •Параметризированные функции и функции общего назначения
 - •Эффективность
 - •Массивы
 - •Одномерный массив
 - •Создание указателя на массив
 - •Передача одномерных массивов в функции
 - •Двумерные массивы
 - •Массивы строк
 - •Многомерные массивы
 - •Индексация с помощью указателей
 - •Размещение массивов
 - •Инициализация массива
 - •Инициализация безразмерных массивов
 - •Пример программы игры в крестики-нолики
 - •Указатели
 - •Указатели - это адреса
 - •Переменные-указатели
 - •Операторы для работы с указателями
 - •Выражения с указателями
 - •Присваивание указателей
 - •Арифметические действия с указателями
 - •Сравнение указателей
 - •Динамическое выделение и указатели
 - •Указатели на константы
 - •Указатели на константы
 - •Указатели на константы
 - •Указатели и массивы
 - •Указатели на символьные массивы
 - •Массивы указателей
 - •Указатели на указатели - многочисленное перенаправление
 - •Инициализация указателей
 - •Указатели на функции
 - •Проблемы, связанные с указателями
 - •Структуры, объединения и определяемые пользователем типы
 - •Структуры
 - •Доступ к членам структуры
 - •Присваивание структур
 - •Массивы структур
 - •Программа инвентаризации
 - •Передача структур в функции
 - •Передача членов структур в функции
 - •Передача всей структуры в функцию
 - •Указатели на структуры
 - •Объявление указателя на структуру
 - •Использование указателей на структуру
 - •Массивы и структуры в структурах
 - •Битовые поля
 - •Объединения
 - •Перечисления
 - •Использование sizeof для обеспечения переносимости
 - •Ввод, вывод, потоки и файлы
 - •Потоки и файлы
 - •Текстовые потоки
 - •Двоичные потоки
 - •Консольный ввод/вывод
 - •Чтение и запись символов
 - •Чтение и запись строк: gets() и puts()
 - •Форматированный консольный ввод/вывод
 - •Печать символов
 - •Вывод чисел
 - •Вывод адресов
 - •Спецификатор %n
 - •Модификаторы формата
 - •Спецификатор минимума ширины поля
 - •Спецификатор точности
 - •Выровненный вывод
 - •Работа с другими типами данных
 - •Модификаторы * u #
 - •Спецификаторы формата
 - •Ввод чисел
 - •Ввод беззнаковых целых
 - •Чтение отдельных символов с помощью scanf()
 - •Чтение строк
 - •Ввод адреса
 - •Спецификатор %n
 - •Использование множества сканирования
 - •Пропуск нежелательных специальных символов
 - •Обычные символы в управляющей строке
 - •В scanf() следует передавать адреса
 - •Модификаторы формата
 - •Подавление ввода
 - •Файловая система ansi с
 - •Указатель на файл
 - •Открытие файла
 - •Запись символа
 - •Чтение символа
 - •Использование fopen(), getc(), putc() и fclose()
 - •Использование feof()
 - •Две расширенные функции: getw() и putw()
 - •Работа со строками: fgets() и fputs()
 - •Fseek() и произвольный доступ
 - •Удаление файлов
 - •Работа с консолью
 - •Препроцессор и комментарии
 - •Директивы условной компиляции
 - •Использование defined
 - •Операторы препроцессора # и ##
 - •Предопределенные макросы
 - •Комментарии
 
Запись символа
Система ввода/вывода ANSI С определяет две эквивалентные функции, выводящие символ - putc() и fputc(). (На самом деле putc() реализована в виде макроопределения.) Поддержка двух идентичных функций необходима для сохранения совместимости со старыми версиями С.
Функция putc() используется для записи символов в поток, ранее открытый для записи с помощью функции fopen(). Прототип для putc() следующий: int putc(int ch, FILE *fp); где fp — это указатель на файл, возвращенный fopen(), a ch - выводимый символ. Указатель на файл указывает putc(), в какой файл следует писать. По историческим причинам ch определена как int, но используется только младший бит.
Если putc() выполнена успешно, она возвращает выведенный символ. В противном случае возвращает EOF.
Чтение символа
Имеется две эквивалентные функции, предназначенные для ввода символа - getc() и fgetc(). Поддержка двух идентичных функций необходима для сохранения совместимости со старыми версиями С.
Функция getc() используется для чтения символов из потока, открытого на чтение с помощью fopen(). Прототип getc() следующий: int getc(FILE *fp); где fp - это указатель на файл типа FILE *, возвращенный fopen(). По традиции getc() возвращает целое, но старший байт установлен в 0.
Функция getc() возвращает EOF при достижении конца файла. Для чтения текстового файла до конца следует использовать следующий код: ch = getc(fp); while(ch!=EOF) { ch = getc(fp); }
fclose()
Функция fclose() используется для закрытия потока, ранее открытого с помощью fopen(). Она сохраняет в файл данные, находящиеся в дисковом буфере, и выполняет операцию системного уровня по закрытию файла. Вызов fclose() освобождает блок управления файлом, связанный с потоком, и делает его доступным для повторного использования.
Функция fclose() имеет прототип: int fclose(FILE *fp); где fp - это указатель на файл, возвращенный fopen(). Если возвращен 0, то это означает, что операция закрытия выполнена успешно, а если EOF, то, значит, была ошибка.
Использование fopen(), getc(), putc() и fclose()
Функции fopen(), getc(), putc() и fclose() составляют минимальный набор файловых операций. Ниже приведен простой пример использования putc(), fopen() и fclose() в программе ktod. Она просто читает символы с клавиатуры и записывает их в файл, пока не встретится точка. Имя файла указывается в командной строке. Например, если назвать программу ktod, а затем набрать ktod test, то можно будет ввести строчки текста в файл test. /* ktod: ключ к диску */ #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; char ch; if (argc!=2) { printf("You forgot to enter the filename."); return 1; } if((fp=fopen(argv[l], "w")) == NULL) { printf("Cannot open file."); return 1; } do { ch = getchar(); putc(ch, fp) ; } while (ch!='.'); fclose(fp); return 0; }
Программа dtos читает любой текстовый файл и выводит его содержимое на экран. В командной строке следует указать имя файла. /* dtos: диск на экран */ #include <stdio.h> int main(int argc, char *argv[]) { FILE * fp; char ch; if (argc!=2) { printf("You forgot to enter the filename."); return 1; } if((fp=fopen(argv[1], "r")) == NULL) { printf("Cannot open file."); return 1; } ch = getc(fp); /* чтение одного символа */ while (ch!=EOF) { putchar(ch); /* вывод на экран */ ch = getc(fp); } fclose(fp); return 0; }
