
- •Федеральное агентство по образованию
- •Краткая история языка с
- •Особенности и основные понятия языка Си
- •Структура программы
- •Типы данных
- •Классификация типов данных
- •Вещественные
- •Логический
- •Диапазоны представления данных
- •Объявление переменных
- •Константы в языке Си
- •Операции языка Си. Приоритет операций
- •Операция присваивания
- •Арифметические операции
- •Операции отношения
- •Логические операции
- •Поразрядные операции
- •Операцияsizeof
- •Операция выбора по условию
- •Операция запятая
- •Приведение типов Неявное преобразование типов
- •Явное преобразование типов
- •Основные средства ввода-вывода на Си Понятие потока
- •Стандартные потоки
- •Функции потокового ввода-вывода
- •Функции ввода
- •Ввод символов
- •Ввод строк
- •Форматированный ввод
- •Операторы языка Си
- •Оператор if
- •Оператор switch
- •Оператор while
- •Оператор do while
- •Оператор for
- •Оператор break
- •Оператор continue
- •Функции вывода на экран
- •Вывод символов
- •Функция вывода строк puts()
- •Форматированный вывод
- •Указатели в языке Си
- •Адресная арифметика
- •Массивы
- •Функции в языке с
- •Прототипы функций
- •Указатели типа void
- •Функции, возвращающие указатели
- •Встраиваемые функции
- •Рекурсивные функции
- •Функции с переменным числом аргументов
- •Аргументы функции main()
- •Область действия и область видимости
- •Локальные переменные
- •Локальные переменные в функции Main()
- •Глобальные переменные
- •Классы памяти
- •Указатели на указатели
- •Указатели и многомерные массивы
- •Массивы указателей
- •Указатели на функции
- •Операции над строками символов Определение длины строки
- •Копирование строк
- •Поиск в строках
- •Преобразования символов в строках
- •Другие функции для работы со строками
- •Преобразования строк в числа
- •Преобразования чисел в строки
- •Функции анализа символов
- •Распределение памяти
- •Манипулирование блоками памяти
- •Типы, определяемые пользователем
- •Перечислимый тип
- •Структуры
- •Сложные структуры
- •Битовые поля в структурах
- •Объединения
- •Работа с файлами Связь между потоками и файлами
- •Типы дисковых файлов
- •Открытие файла
- •Запись и чтение данных
- •Форматированный ввод-вывод Форматированный вывод
- •Int fprintf (file *fp, char *fmt, ...);
- •Форматированный ввод
- •Символьный ввод
- •Символьный вывод
- •Блочный ввод-вывод
- •Закрытие файла
- •Директивы препроцессора
- •Директива #include
- •Директива #define
- •Директивы условной компиляции
- •Директива #undef
- •Предопределенные макросы
- •69 Лекции по курсу «Языки программирования» Часть III
Работа с файлами Связь между потоками и файлами
Все операции ввода-вывода, в том числе из файлов и в файлы, выполняются с помощью потоков. Потоки для работы с файлами устроены и работают точно так же. Основное отличие работы с потоками дисковых файлов от стандартных потоков состоит в том, что такой поток необходимо создать в программе явным образом и ассоциировать его с конкретным файлом на диске.
Типы дисковых файлов
Ранее говорилось, что в С имеется два типа потоков: текстовые и двоичные. Поток любого из этих типов можно ассоциировать с файлом, но при этом важно понимать разницу между ними, чтобы корректно ими пользоваться.
Текстовые потоки ассоциируются с текстовыми файлами. Текстовый файл состоит из последовательности строк. Каждая строка содержит нулевое или ненулевое количество символов и заканчивается одним или несколькими символами, обозначающими конец строки. Важно помнить, что строка в текстовом файле — это не то же самое, что символьная программе на Си, потому что в ней нет завершающего нулевого символа (\0). При работе с текстовым потоком выполняется автоматическое взаимное преобразование символа конца строки Си (\n) и символа (или символов), который используется операционной системой для обозначения концов строк в файлах.
Двоичные потоки ассоциируются с двоичными файлами. Все данные считываются и записываются в неизменном виде, без разделения на строки и символов конца строки. Нулевой символ (\0) и символ конца строки (\n) не имеют никакого особого смыслового значения и воспринимаются как любой другой байт данных.
Некоторые функции ввода-вывода могут работать только в одном из двух режимов, другие — в обоих.
Открытие файла
Для открытия файла используется библиотечная функция fopen().
Прототип fopen() находится в файле stdio.h и выглядит следующим образом:
FILE *fopen(const char *filename, const char *mode);
Для каждого открываемого файла необходимо объявить указатель на структуру FILE. При вызове функции fopen() она создает экземпляр структуры FILE и возвращает указатель на нее. Этот указатель затем используется в последующих операциях с файлом. Если функция fopen() не смогла открыть файл, она возвращает нулевой указатель NULL. Это может произойти из-за какого-либо сбоя в устройствах ввода-вывода или, например, при попытке открыть файл на неформатированном диске.
Аргумент mode указывает режим открытия файла: является ли он текстовым или двоичным, открывается ли файл для чтения, записи или обеих этих операций. Возможные значения аргумента mode перечислены в следующей таблице.
Режим |
Значение |
r |
Открытие файла для чтения. Если файл не существует, функция fopen() возвращает NULL |
w |
Открытие файла для записи. Если файл не существует, он создается. Если существует, он удаляется без предупреждения, а взамен создается новый пустой |
a |
Открытие файла для добавления данных в конец. Если файл не существует, он создается. Если файл существует, новые данные дописываются в его конец. |
r+ |
Открытие файла для чтения и записи. Если файл не существует, он создается. Если существует, новые данные записываются с его начала, затирая уже имеющую информацию |
w+ |
Открытие файла для чтения и записи. Если файл не существует, он создается. Если файл существует, он очищается, и новые данные записываются в очищенный файл. |
a+ |
Открытие файла для чтения и добавления данных. Если файл не существует, он создается. Если файл существует, новые данные дописываются в его конец. |
По умолчанию файл открывается для работы в текстовом режиме. Чтобы открыть его в двоичном режиме, к аргументу mode следует добавить букву b. Таким образом, если аргумент mode равен a, то файл открывается для добавления данных в текстовом режиме, а если ab — то в двоичном.