
- •Федеральное агентство по образованию
- •Краткая история языка с
- •Особенности и основные понятия языка Си
- •Структура программы
- •Типы данных
- •Классификация типов данных
- •Вещественные
- •Логический
- •Диапазоны представления данных
- •Объявление переменных
- •Константы в языке Си
- •Операции языка Си. Приоритет операций
- •Операция присваивания
- •Арифметические операции
- •Операции отношения
- •Логические операции
- •Поразрядные операции
- •Операцияsizeof
- •Операция выбора по условию
- •Операция запятая
- •Приведение типов Неявное преобразование типов
- •Явное преобразование типов
- •Основные средства ввода-вывода на Си Понятие потока
- •Стандартные потоки
- •Функции потокового ввода-вывода
- •Функции ввода
- •Ввод символов
- •Ввод строк
- •Форматированный ввод
- •Операторы языка Си
- •Оператор if
- •Оператор switch
- •Оператор while
- •Оператор do while
- •Оператор for
- •Оператор break
- •Оператор continue
- •Функции вывода на экран
- •Вывод символов
- •Функция вывода строк puts()
- •Форматированный вывод
- •Указатели в языке Си
- •Адресная арифметика
- •Массивы
- •Функции в языке с
- •Прототипы функций
- •Указатели типа void
- •Функции, возвращающие указатели
- •Встраиваемые функции
- •Рекурсивные функции
- •Функции с переменным числом аргументов
- •Аргументы функции main()
- •Область действия и область видимости
- •Локальные переменные
- •Локальные переменные в функции Main()
- •Глобальные переменные
- •Классы памяти
- •Указатели на указатели
- •Указатели и многомерные массивы
- •Массивы указателей
- •Указатели на функции
- •Операции над строками символов Определение длины строки
- •Копирование строк
- •Поиск в строках
- •Преобразования символов в строках
- •Другие функции для работы со строками
- •Преобразования строк в числа
- •Преобразования чисел в строки
- •Функции анализа символов
- •Распределение памяти
- •Манипулирование блоками памяти
- •Типы, определяемые пользователем
- •Перечислимый тип
- •Структуры
- •Сложные структуры
- •Битовые поля в структурах
- •Объединения
- •Работа с файлами Связь между потоками и файлами
- •Типы дисковых файлов
- •Открытие файла
- •Запись и чтение данных
- •Форматированный ввод-вывод Форматированный вывод
- •Int fprintf (file *fp, char *fmt, ...);
- •Форматированный ввод
- •Символьный ввод
- •Символьный вывод
- •Блочный ввод-вывод
- •Закрытие файла
- •Директивы препроцессора
- •Директива #include
- •Директива #define
- •Директивы условной компиляции
- •Директива #undef
- •Предопределенные макросы
- •69 Лекции по курсу «Языки программирования» Часть III
Символьный вывод
Имеется несколько функций символьного вывода, которые необходимо знать: putc(), fputc() и fputs().
Функции putc() и fputc()
Библиотечные функции putc() и fputc() записывают одиночный символ в заданный поток вывода. Функция putc () имеет следующий прототип, объявленный в файле stdio.h:
int putc(int ch, FILE *fp);
Аргумент ch — это символ, который нужно вывести. Как и в других функциях символьного вывода, он формально имеет тип int, но фактически используется только eго младший байт.
Аргумент fр — это указатель на поток, ассоциированный с файлом (возвращается из функции fopen() при открытии файла).
Функция putc() возвращает выведенный символ (в случае успеха) или EOF (в случае ошибки). Символическая константа EOF определена в файле stdio.h и имеет значение -1. Поскольку это значение не соответствует никакому реальному символу, его можно использовать для указания конца файла (только в текстовом режиме).
Функция fputs()
Для записи строки символов в файл используется библиотечная функция fputs(). Она практически идентична функции puts().Единственное отличие состоит в том, что для fputs() необходимо указать поток вывода. Кроме того, fputs() не добавляет символ конца строки автоматически— если он нужен, программисту приходится делать это самостоятельно другими средствами. Ее прототип объявлен в файле stdio.h:
char fputs(char *str, FILE *fp);
Аргумент str — это указатель на строку с завершающим нулевым символом, которую следует вывести,
fр — указатель на структуру FILE, возвращенный из функции fopen() при открытии файла. Строка str записывается в файл, причем нулевой завершающий символ отбрасывается. Функция fputs() возвращает положительное значение в случае успеха аи EOF, если произошла ошибка.
Блочный ввод-вывод
Блочный ввод-вывод используется в основном при сохранении данных, которые затем будет считывать та же самая или другая программа на Си. Этот способ ввода-вывода используется только с двоичными файлами. В процессе блочного вывода блоки данных копируются целиком из памяти на диск. Блочный ввод представляет собой обратный процесс: блоки данных считываются с диска в память. Например, с помощью одного вызова функции блочного вывода можно записать на диск сразу целый массив типа double, а затем одним вызовом функции блочного ввода считать весь этот массив с диска обратно в память. Блочный ввод-вывод выполняется функциями fread() и fwrite().
Функция fwrite()
Библиотечная функция fwrite() записывает блок данных из памяти в двоичный файл. Ее прототип, объявленный в файле stdio. h, имеет следующий вид:
int fwrite(void *buf, int size, int count, FILE *fp);
Аргумент buf представляет собой указатель на участок памяти, содержащий данные для записи в файл. Он объявлен с типом void — это означает, что аргумент может быть указателем любого типа.
Аргумент size указывает размер в байтах отдельных элементов данных в блоке, а аргумент count— их общее количество.
Например, если нужно записать в файл массив из 100 целочисленных значений, то size будет равен 2 (переменные типа int занимают два байта), а count будет равен 100 (в массиве 100 элементов). Для вычисления аргумента size можно воспользоваться операцией sizeof ().
Аргумент fр, как и ранее, является указателем на структуру FILE, возвращенным из функции fopen() при открытии файла.
Функция fwrite() возвращает количество элементов данных, записанных в файл. Если это количество меньше аргумента count, то произошла какая-то ошибка. Для проверки правильности вывода обычно используется следующая конструкция:
if ( (fwrite (buf, size, count, fp)) != count)
fprintf(stderr, "Ошибка чтения файла.");
Несколько примеров использования функции fwrite().
Для записи в файл одной переменной х типа double используется следующий оператор:
fwrite (&x, sizeof(double), 1, fp);
Массив data[], содержащий 50 структур типа address, можно записать любым из двух способов:
fwrite (data, sizeof (address), 50, fp); или fwrite(data, sizeof (data), 1, fp);
Первый оператор записывает массив из 50 элементов, каждый длиной со структуру address. Во втором операторе массив data считается одним элементом. Результаты выполнения этих операторов совершенно одинаковы.
Функция fread()
Библиотечная функция freed() считывает блок данных из двоичного файлового потока в память. Вот ее прототип, объявленный в файле stdio.h:
int fread (void *buf, int size, int count, FILE *fp);
Аргумент buf представляет собой указатель на участок памяти, в который помещаются данные из файла. Как и в функции fwrite (), указатель имеет тип void.
Аргумент size указывает размер (в байтах) отдельных элементов данных считываемого блока, a count — их общее количество. Вспомните, что аналогичные аргументы имеет и функция fwrite(). Для вычисления аргумента size часто используется операция sizeof (). Аргумент fp— это, как всегда, указатель на структуру FILE, возвращенный функцией fopen() при открытии файла. Функция fread() возвращает количество считанных элементов данных. В случае ошибки или достижения конца файла это число может быть меньше аргумента count.