Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Стандартные файлы
Программы на С автоматически открывают три файла, которые называются стандартным вводом, стандартным выводом и стандартным выводом ошибок. По умолчанию стандартный ввод представляет собой обычное устройство ввода в вашей системе, как правило, клавиатуру. Стандартный вывод и стандартный вывод ошибок по умолчанию являются обычным устройством вывода вашей системы, т.е. экраном монитора.
Естественно, стандартный ввод обеспечивает ввод данных в программу. Это файл, который читается с помощью функций getchar() и scanf(). Стандартный вывод - место, куда направляется обычный вывод программы. Он используется функциями putchar(), puts() и printf(). Перенаправление, как вы уже знаете из главы 8, приводит к тому, что другие файлы опознаются как стандартный ввод и стандартный вывод. Назначение файла стандартного вывода ошибок заключается в том, чтобы предоставить логически обособленное место для отправки сообщений об ошибках.
Файловый ввод-вывод 535
Например, если вместо экрана вы перенаправите вывод в файл, то сообщения, от правляемые в стандартный вывод ошибок, по-прежнему будут попадать на экран. Это удобно, т.к. если бы сообщения об ошибках направлялись также в файл, то вы бы их не увидели до тех пор, пока не просмотрели файл.
Стандартный ввод-вывод
По сравнению с низкоуровневым вводом-выводом стандартный пакет ввода-вывода, помимо переносимости, обладает еще двумя преимуществами. Во-первых, в нем доступно множество специализированных функций, которые упрощают решение разнообразных задач, связанных с вводом-выводом. Например, функция printf() преобразует различные формы данных в строковый вывод, подходящий для терминалов. Во-вторых, ввод и вывод являются буферизированными. Это значит, что информация передается крупными порциями (обычно по 512 и более байтов), а не по одному байту за раз. Например, когда программа читает файл, порция данных считывается в буфер — промежуточную область памяти. Такая буферизации существенно увеличивает скорость передачи данных. Затем программа может исследовать отдельные байты в этом буфере. Буферизация происходит “за кулисами”, поэтому создается иллюзия посимвольного доступа. (Вы также можете буферизировать низкоуровневый ввода-вывода, но большую часть работы придется проделать самостоятельно.)
В листинге 13.1 показано, как применять ставдартный ввод-вывод для чтения файла и подсчета количества находящихся в нем символов. Свойства программы из листинга 13.1 мы обсудим в нескольких последующих разделах. (Эта программа использует аргументы командной строки. Если вы работаете в среде Windows, можете после компиляции запустить программу в окне командной строки. Если вы имеете дело с Macintosh, проще всего скомпилировать и запустить программу в форме командной строки с использованием Terminal. Или же, как объяснялось в главе 11, в XCode посредством меню Products (Продукты) можно предоставить аргументы командной строки для программы, запускаемой из IDE-среды. В качестве альтернативы программу можно изменить так, чтобы для получения имени файла вместо аргумента командной строки применялись функции puts() и gets().)
Листинг 13.1. Программа count.с
536 Глава 13
Проверка наличия аргумента командной строки
Первым делом программа в листинге 13.1 проверяет значение argc, чтобы выяснить, имеется ли аргумент командной строки. Если аргумент отсутствует, программа выводит инструкцию по ее использованию и завершается. Строка argv [0] — это имя программы. Явное применение argv[0] вместо имени программы обеспечит автоматическое изменение сообщения об ошибке, если вы измените имя исполняемого файла. Такая возможность полезна в средах, подобных Unix, которые разрешают иметь много имен для одного файла. Но будьте осторожны — некоторые операционные системы могут не распознавать argv[0], поэтому такой прием не является полностью переносимым.
Функция exit() приводит к прекращению работы программы с закрытием всех открытых файлов. Аргумент exit() передается некоторым операционным системам, включая Unix, Linux, Windows и MS-DOS, где он может использоваться другими программами. Обычное соглашение предусматривает возвращение 0 при успешном завершении и ненулевого значения в случае ненормального завершения.
Разные выходные значения могут применяться для обозначения различных причин отказа, и это установившаяся практика программирования в средах Unix и DOS. Тем не менее, не все операционные системы распознают один и тот же диапазон возможных возвращаемых значений. Вследствие этого стандарт С устанавливает использование довольно ограниченного минимального диапазона. В частности, стандарт требует, чтобы при успешном завершении программы применялось значение 0 или макрос EXIT_SUCCESS, а неудачное завершение указывалось с помощью макроса EXIT FAILURE. Эти макросы, наряду с прототипом exit(), находятся в заголовочном файле stdlib.h.
В рамках ANSI С использование return в первоначальном вызове main() дает тот же результат, что и вызов exit(). По этой причине в main() оператор
return 0;
который встречался на протяжении всей книги, эквивалентен следующему оператору:
exit(0);
Однако обратите внимание на определяющую фразу “в первоначальном вызове”. Если функция main() задействована в рекурсивной программе, то exit() по-прежнему приводит к прекращению ее работы, но return передает управление предыдущему уровню рекурсии до тех пор, пока не будет достигнут первоначальный уровень. Только после этого return завершает выполнение программы. Еще одно отличие между return и exit() состоит в том, что функция exit() прекращает работу программы, даже если она вызвана в функции, отличной от main().
Файловый ввод-вывод 537
функция fopen()
Далее в программе с помощью функции fopen() открывается файл. Эта функция объявлена в заголовочном файле stdio.h. Ее первым аргументом является имя файла, который необходимо открыть; точнее, это адрес строки, содержащей имя файла. Второй аргумент — строка, идентифицирующая режим, в котором файл должен быть открыт. В библиотеке С предоставляется несколько возможностей, показанных в табл. 13.1.
Таблица 13.1. Строки режима для fopen()
Для таких систем, как Unix и Linux, которые имеют только один файловый тип, режимы с буквой b эквивалентны соответствующим режимам без буквы b.
Новые режимы записи C11 с буквой х обладают парой новых характеристик но сравнению со старыми режимами записи. Во-первых, если вы пытаетесь открыть существующий файл в одном из традиционных режимов записи, то fopen() усекает файл до нулевой длины, в результате чего предыдущее содержимое файла утрачивается. Но режимы с буквой х обеспечивают в таком случае отказ функции fopen() от дальнейшей работы, не причиняя вреда файлу. Во-вторых, при условии, что это позволяет среда, возможность монопольного доступа в режимах с х предотвращает доступ к файлу со стороны других программ или потоков до тех пор, пока текущий процесс не закроет этот файл.
Читать дальшеИнтервал:
Закладка: