
- •Происхождение языка с
- •Язык среднего уровня
- •Структурированный язык
- •Язык программирования
- •Компиляторы против интерпретаторов
- •Вид программ на с
- •Библиотеки и компоновка
- •Раздельная компиляция
- •Карта памяти с-программы
- •Переменные, константы, операторы и выражения
- •Идентификаторы
- •Типы данных
- •Модификаторы типов
- •Модификаторы доступа
- •Объявление переменных
- •Локальные переменные
- •Формальные параметры
- •Глобальные переменные
- •Спецификаторы хранения
- •Статические переменные
- •Статические локальные переменные
- •Статические глобальные переменные
- •Регистровые переменные
- •Оператор присваивания
- •Многочисленное присваивание
- •Преобразование типов при присваивании
- •Инициализация переменных
- •Константы
- •Символьные константы с обратным слэшем
- •Операторы
- •Арифметические операторы
- •Увеличение и уменьшение
- •Операторы отношения и логические операторы
- •Битовые операторы
- •Оператор ?
- •Операторы указания & и *
- •Оператор 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
- •Операторы препроцессора # и ##
- •Предопределенные макросы
- •Комментарии
Подавление ввода
Можно заставить scanf() прочитать поле, но не присвоить его какой-либо переменной, поставив перед кодом формата поля *. Например, имея scanf ("%d%*c%d", &x, &у); можно ввести пару координат 10,10. Запятая будет корректно прочитана, но ничему не присвоена. Подавление присваивания особенно полезно, когда необходимо обработать только часть вводимой информации.
Файловая система ansi с
Файловая система ANSI С является частью системы ввода/вывода, позволяющей читать или записывать файлы. Она содержит несколько взаимосвязанных функций. Наиболее типичные показаны в таблице. Заголовочный файл stdio.h должен включаться в любую программу, использующую данные функции.
Заголовочный файл stdio.h предоставляет прототипы для функций ввода/вывода и определяет три типа: size_t, fpos_t и FILE. Тип size_t - это беззнаковое целое, как и fpos_t. Тип FILE обсуждается в следующем разделе.
stdio.h также определяет несколько макросов. Наиболее значимыми для данной главы являются NULL, EOF, FOPEN_MAX, SEEK_SET, SEEK_CUR и SEEK_END. Макроопределение NULL -это нулевой указатель. Макроопределение EOF, как правило, определятся как -1 и его значение, возвращается, когда функция ввода пытается прочесть конец файла. Макроопределение FOPEN_MAX - это целочисленное значение, определяющее максимальное число одновременно открытых файлов. Другие макроопределения используются с функцией fseek(), выполняющей произвольный доступ к файлу.
Таблица: Наиболее типичные функции файловой системы ANSI С |
|
Имя |
Функция |
open() fclose () putc() fputc() getc() fgetc() fseek() fprintf() fscanf() feof() ferror() rewind() remove() fflush() |
Открывает файл Закрывает файл Записывает символ в файл Аналогично putc() Читает символ из файла Аналогично getc() Переходит к указанному байту в файле Делает то же в файл, что и printf() на консоль Делает то же с файлом, что и scanf() с консолью Возвращает истину при достижении конца файла Возвращает истину при обнаружении ошибки Сбрасывает индикатор позиции файла на начало файла Стирает файл Очищает буфер файла |
Указатель на файл
Указатель на файл - это нечто, объединяющее файловую систему ANSI С. Указатель на файл - это указатель на информацию, определяющую различные параметры файла, включая его имя, состояние и текущую позицию. В принципе, указатель на файл идентифицирует конкретный дисковый файл и используется потоком для выполнения операций ввода/вывода. Указатель на файл - это переменная-указатель типа FILE. Чтобы прочитать или записать файлы, программе надо использовать указатели на файлы. Для создания файловой переменной-указателя используется оператор типа: FILE *fp;
Открытие файла
Функция fopen() открывает для использования поток, связывает файл с данным потоком и затем возвращает указатель FILE на данный поток. Чаще всего файл рассматривается как дисковый файл. Функция fopen() имеет следующий прототип: FILE *fopen(const char *имя_файла, const char *режим); где режим указывает на строку, содержащую желаемый режим открытия файла. Допустимые значения для режим в Borland С++ показаны в таблице. имя_файла должно быть строкой символов, предоставляющей корректное имя файла операционной системе, и может содержать указание пути.
Функция fopen() возвращает указатель базового типа FILE. Данный указатель идентифицирует файл и используется большинством функций файловой системы. Его никогда не следует изменять самостоятельно. Функция возвращает нулевой указатель, если файл не может быть открыт.
Как показывает таблица, файл может быть открыт или в текстовом, или в двоичном режиме. В текстовом режиме при вводе последовательность возврат каретки и перевод строки транслируется в символ новой строки. При выводе справедливо обратное: символ новой строки транслируется в возврат каретки и перевод строки. В двоичных файлах такого перевода не происходит. Когда в аргументе режима не указаны ни t, ни b, то статус файла текстовый/двоичный определяется значением глобальной переменной _fmode, определенной в Borland С++. По умолчанию fmode установлена в О_ТЕХТ, то есть устанавливается текстовый режим. Если установить _fmode в О_BINARY, то файлы будут открываться в двоичном режиме. (Эти макросы определены в fcntl.h.) Естественно, использование явно указанных t или b устраняет эффекты, связанные с переменной _fmode. Кроме этого, _fmode характерна только для продуктов Borland. Она не определена в системе ввода/вывода ANSI С.
Если необходимо открыть файл с именем test на запись, то следует написать: fp = fopen ("test", "w") ; где fp - это переменная типа FILE *. Тем не менее обычно можно увидеть следующее: if((fp = fopen("test", "w"))==NULL) { puts ("Cannot open file."); exit (1); } Данный метод позволяет обнаружить ошибки при открытии файла, например, наличие защиты от записи или отсутствие свободного места на диске.
Если fopen() используется для открытия файла на запись, то любой ранее существующий файл с указанным именем будет удален. Если файла с указанным именем не существует, то он будет создан.
Если необходимо дописать информацию в конец файла, следует использовать режим а (добавления). Если файл не существует, то он будет создан.
Открытие файла на чтение требует наличия файла. Если файл не существует, то будет возвращена ошибка. Если файл открыт для операции чтения/записи, то он не удаляется при наличии, а если файл не существует, то он создается.
Таблица: Допустимые значения режимов |
|
Режим |
Значение |
"r" |
Открывает файл для чтения. (Открывает по умолчанию как текстовый файл.) |
"w" |
Создает файл для записи. (Открывает по умолчанию как текстовый файл.) |
"а" |
Присоединяет к файлу. (Открывает по умолчанию как текстовый файл.) |
"rb" |
Открывает двоичный файл для чтения. |
"wb" |
Открывает двоичный файл для записи. |
"ab" |
Присоединяет к двоичному файлу. |
"r+" |
Открывает файл для чтения/записи. (Открывает по умолчанию как текстовый файл.) |
"w+" |
Создает файл для чтения/записи. (Открывает по умолчанию как текстовый файл.) |
"a+" |
Присоединяет или создает файл для чтения/записи. (Открывает по умолчанию как текстовый файл.) |
"r+b" |
Открывает двоичный файл для чтения/записи. |
"w+b" |
Создает двоичный файл для чтения/записи. |
"a+b" |
Присоединяет или создает двоичный файл для чтения/записи. |
"rt" |
Открывает текстовый файл для чтения. |
"wt" |
Создает текстовый файл для записи. |
"at" |
Присоединяет к текстовому файлу. |
"r+t" |
Открывает текстовый файл для чтения. |
"w+t" |
Создает текстовый файл для чтения/записи. |
"a+t" |
Открывает или создает текстовый файл для чтения/записи. |