Язык Си - руководство для начинающих
Шрифт:
days(monlh);
inl month;
{
int index, tolal;
if(month < 1 || month > 12)
return (-1); /* признак ошибки */
else
for(index = 0, total = 0; index < month; index++)
total + = months [index].days;
return (total);}
Заметим, что index содержит
6.
ЛИНЗА tubby [10];
tubby [2].foclen = 300.0;
tubby [2].fstop = 2.0;
tubby [2].brand = "Рсмаркатар";
УПРАЖНЕНИЯ
1. Переделайте вопрос 5, используя в качестве аргумента написанное буквами название месяца вместо номера месяца. [Не забывайте о функции strcmp.]
2. Напишите программу, которая запрашивает у пользователя день, месяц и год. Месяц может обозначаться номером, названием месяца или его аббревиатурой. После работы программа выдает общее количество дней в году вплоть до данного дня.
3. Переделайте нашу программу инвентаризации книг таким образом, чтобы она печатала информацию о книгах, упорядоченную в алфавитном порядке по названиям книг, и затем печатала общую стоимость книг.
15. Библиотека языка Си и файлы ввода-вывода
БИБЛИОТЕКА ЯЗЫКА СИ
ФАЙЛЫ В ЯЗЫКЕ СИ
ФУНКЦИИ РАБОТЫ С ФАЙЛОМ
МАКРООПРЕДЕЛЕНИЯ ДЛЯ ПРОВЕРКИ СИМВОЛОВ
ФУНКЦИИ РАСПРЕДЕЛЕНИЯ ПАМЯТИ
Всякий раз, когда нам нужно использовать такие функции, как printf, getchar и strlen, мы обращаемся в библиотеку языка Си. Она содержит множество функций и макроопределений. Библиотеки меняются от системы к системе, но есть ядро функций (называемое стандартной библиотекой), которое используется чаще всего. В этой главе мы рассмотрим пятнадцать наиболее общих из этих функций, уделяя больше внимания функциям ввода-вывода и использованию файлов.
Однако сначала давайте поговорим о том, как пользоваться библиотекой.
ДОСТУП В БИБЛИОТЕКУ ЯЗЫКА СИ
Получение доступа к библиотеке зависит от системы, поэтому вам нужно посмотреть в своей системе, как применять наиболее распространенные операторы. Во-первых, есть несколько различных мест расположения библиотечных функций. Например, getchar обычно задают как макроопределение в файле stdio.h, в то время как strlen обычно хранится в библиотечном файле. Во-вторых, различные системы имеют разные способы доступа к этим функциям. Вот три из них.
Автоматический доступ
Во многих больших системах UNIX вы только компилируете программы, а доступ к более общим библиотечным функциям выполняется автоматически.
Включение файла
Если функция задана как макроопределение, то можно директивой #include включить файл, содержащий ее определение. Часто подобные функции могут быть собраны в соответствующим образом названный заголовочный файл. Например,
Включение библиотеки
На некотором этапе компиляции или загрузки программы вы можете выбрать библиотеку. В нашей системе, например, есть файл lc.lib, содержащий скомпилированную версию библиотечных функций, и мы предлагаем редактору связей IBM PC использовать эту библиотеку. Даже система, которая автоматически контролирует свою стандартную библиотеку, может иметь другие библиотеки редко применяемых функций, и эти библиотеки следует запрашивать явно, указывая соответствующий признак во время компиляции.
Очевидно, мы не сможем рассмотреть все особенности всех систем, но эти три примера должны показать, что вас ожидает. Теперь давайте рассмотрим некоторые функции.
БИБЛИОТЕЧНЫЕ ФУНКЦИИ, КОТОРЫЕ МЫ ИСПОЛЬЗОВАЛИ
Пока мы хотим только перечислить эти функции, чтобы напомнить о них.
Сначала приведем функции ввода-вывода:
getchar /* получение символа */
putchar /* печать символа */
gefs /* получение строки */
puts /* печать строки */
scanf /* получение форматированного ввода */
printf /* печать форматированного вывода */
Затем приведем функции, работающие со строками:
strlen /* нахождение длины строки */
strcmp /* сравнение двух строк */
strcpy /* копирование строки */
strcat /* объединение двух строк */
К этому списку мы добавим функции открытия и закрытия файлов, связи с файлами, проверки и преобразования символов, преобразования строк, функцию выхода и функции распределения памяти.
Давайте сначала обратимся к проблеме связи между файлом и программой.
СВЯЗЬ С ФАЙЛАМИ
Часто нам бывает нужна программа получения информации от файла или размещения результатов в файле. Один способ организации связи программы с файлом заключается в использовании операций переключения < и >. Этот метод прост, но ограничен. Например, предположим, вы хотите написать диалоговую программу, которая спрашивает у вас названия книг (звучит фамильярно?), и вы намерены сохранить весь список в файле. Если вы используете переключение как, например, в
books > bklist
то ваши диалоговые приглашения также будут переключены на bklist. И тогда не только нежелательная чепуха запишется в bklist, но и пользователь будет избавлен от вопросов, на которые он, как предполагалось, должен отвечать.
К счастью, язык Си предоставляет и более мощные методы связи с файлами. Один подход заключается в использовании функции fopen, которая открывает файл, затем применяются специальные функции ввода-вывода для чтения файла или записи в этот файл и далее используется функция fclose для закрытия файла. Однако прежде чем исследовать эти функции, нам нужно хотя бы кратко познакомиться с сущностью файла.