Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 163
Текст из файла (страница 163)
В) А<В? А: В аЬВ теперь можно использовать в любом выражении. Например, выражение аЬя(пе»тчаг. о)г)чаг) после обработки макроопределения преобразуется в выраже- ние пеичаг < о!Очаг ? пе»тчаг: о1т)чаг, которое и будет транслироваться компиля- тором, Директива №т пс1цт)е добавляет в программу текст из соответствующего файла: №тпс1ыт)е < иия файла > №тпс1ыее "имя файла" Первая директива добавляет файл с указанным именем из системной библио- теки, которая в системе Т))м)ТХ обычно находится в каталоге /цвт?1псЫе.
Вторая директива добавляет файл из того же каталога, в котором расположен файл, со- держащий текст исходной программы. Существует соглашение, по которому все определения интерфейсов хранятся в заголовочных файлах . Ь и при необходимо- сти копируются директивой №т пс1рт)е. Директива №т Тт)е№ используется для проверки, было ли ранее определено дан- ное имя. Если было, то в исходный текст программы добавляется последователь- ность операторов №ттсег имя переменной операторы №епш г Аналогично директива №1 ТпОег добавляет операторы, если имя не было ранее определено, Директива №1 Т добавляет текст в зависимости от значения заданного в ней кон- стантного выражения. Директива №рпт)ей делает имя более не определенным: №ипт)е№ нмя перененной.
Директива №е1ве используется в качестве предложения е1ве в директивах №т Т, №т Нег, №1 Тпт)е№ в случае, если не выполнено условие, заданное в них самих. Ввод и вывод В языке С не существует специальных операторов ввода и вывода. Ввод и вывод осуцтествляется с помощью заранее указанного набора функций, которые опреде- лены в заголовочном файле вЕт)1о.Ь. Ввод и вывод описаны в следующем разделе < Стандартные функции».
590 Приложение. Обзоры языков Стандартные функции Сила языка С заключена в богатой библиотеке функций, которые оказывают неоценимую помощь программисту при написании программы. Многие из них напрямую связаны с операционной системой. В данной книге пет возможности описать их все. Ниже приведены лишь те функции, которые наиболее важны для написания простых программ. Стандартный ввод и вывод.
Определения этих функций находятся в файле яЫ)о.)т. Для простых программ ввода и вывода наиболее важными являются детсйа г (для ввода символов) и рггпСт (для простого форматированного вывода). Файлы Нв)л и я1г)оо! заранее определены соответственно в качестве стандартного входного файла (обычно это клавиатура) и стандартного выходного файла (обычно это экран монитора), Эти имена в списке параметров могут быть просто опущены. Например, для считывания символов из файла требуется функция детс1Г)!злая)е), в то время как для считывания с клавиатуры необходимо просто детс)таг без имени файла.
Функция детс11аг определена просто как дегс(з1г)1л). Определена именованная константа ЕОГ, которая используется для обозначения достижения конца файла. (Обычно это значение устанавливается равным -1, чтобы отличить его от всех стальных считываемых символов.) Функция 1лг дегс)таг1) возвращает очередной символ из входного гготока (згг))л). Функция )лт детс1Г1ЕЕ *имя файла) возвращает следуюгций символ из файла с указанным именем. Функция Г!ее * 1орел(с)гаг *г)1езгггпд, с)гаг *и! егуре) открываетфайл Ейезгплд для ввода (если тт1егуре = "г"), для нового вывода (если 111еьуре = "и") или для добавления к существутощему файлу (если гт1ефуре = "а"), Файлы иб)л (стандартный ввод) и зЫои1(стандартный вывод), а также з1г)егг (вывод ошибок) открываются автоматически. Функция рэгспаг(сггаг х) печатает символ х в файл зйовб Функция ротс!с)таг х, Г1ЕЕ *имя файла) выводит сгглгвол х в файл с указанным именем.
Функция Гдетз(с)гаг *я. гпг п, Г!ЕЕ *имя файла> считывает массив символовиз заданного файла, я является указателем на этот массив. Функция считывает символы до тех пор, пока; 1) не встретит лову)о строку; 2) не достигнет конца файла; 3) пе считает л-1 символ. Завершающий лгтП-сггмвол 'тд добавляется к строке, на которуто указывает я. Функция геот1Г1ЕЕ *имя файла) возврагцает истину, если при предыдущем чтении данного файла был достигнут его конец.
Функция тлт рг)пГт(строка, аргумента) печатает указанную строку в стандартный вывод згг)опй Если после вывода строки на терминале следующий вывод должен начаться на новой строке терминала, то строка должна заканчиваться символом конца строки )и. Если в строке содержится яг) или Ф т, то следующий аргумент из списка параметров печатается в целочисленном формате. Если содержится $я, то предполагается, что следующий аргумент — это строка, завер- П.2. С 591 шаюшаяся пц!1-символом (О, которую требуется распечатать. Фс означает вывод первого символа слепу юп(его аргумента, Фà — формат вывода вещественного числа без явной экспоненты, а $е — формат вывода на печать вещественного числа в экспоненциальной форме.
во означает вывод данных в восьмеричном формате. Функция тп( вргтпт((сПаг *в, строка, артуиенти) действует аналогично ргтп(Е но строка пишется в то место памяти, на которое указывает в. Функции распределения памяти. Эти функции определены в заголовочном файле шайос.П. Функция ното ктва11ос(целочиспенное значение> отводитблок памяти,размеркоторого равен указанному целочисленному значению, и возвращает указатель на него, Функция тпс в тагес((инв типа) возвращает размер объекта указанного типа. Часто используе~ся вместе с па11ос, например: ртгчаг - (пентуре*) иа11ос(втгеот(пентуре)).
Функция тпт аггее(сПаг ва11осртг) восстанавливает область памяти (на которую указывает на1)осрсг), ранее выделенную под некоторый объект с помощью функции на11ос. Строковые функции. Функция спаг *в(гсае(спаг *в1, сПаг *в2) добавляет строку в2 в конец строки в1 и возвращает указатель на в1. Функция сПаг *всгпса((сПаг *в1, сцаг *в2, тос и) добавляет не более и символов из строки в2 (или всю строку в2, если опа короче, чем и) в конец строки в1 и возвращает указатель на в1. Функция тп( втгсвтр(сПаг *в1.
сПаг *в2) возвращает значение, меньшее 0, если строка в1 лексикографнчески меньше, чем в2; значение 0, если они равны; и значение большее О, если в1 больше, чем в2, Функция то( вСгпствр(в1. в2, и) похожанав(гснр,заисключеттиемтого,чтосравненнс производится только до и-го символа в2. Функция сПаг *втгсру(сПаг *в1.
сйаг *в2) копирует строку в2 в строку в1. Указатель возвращается на в1. ФункпцясПаг *в(гпсру(сПаг *в1. сПаг в2. тп( и) копирует первыепсимволов 52 в в1. Функция тпт в(г1еп(сПаг *строка сииволов) возвращаетдлинустроки. Функциипреобразования. Футткц~ибэца)е втг(от)(спас +строка сиивопов, сПаг т тр1г) преобразует содержимое строки к т илу тц оа с и устанавливает указатель р(г на символ, следующий за последним преобразованным символом. Если указатель рсг имеет значение пп)1, это значит, что из строки не удалось выделить вещественное число.
Функция)опд в(гто1(сПаг * строка сиивовов. сПаг **ртг, тпт Паве) преобразует содержимое строки в длинные целые числа (1опд), Здесь Паве — это основание системы счисления вводимых данных. Чаще всего используются значения 2, 8, 10. Функции атот (сПаг *строка сии вопов) (преобразование кодов ЛАСИ в значения типа тот), а Со1 (ЛЯС!! — в 1опд) и а(о( (ЛАСИ вЂ” в т)оа() остались от старых версий языка С. 592 Приложение. Обзоры языков П.З. С++ Пример с пояснениями В листинге П.б представлена С++-версия программы из раздела П.2, написанной на языке С, которая считывает массив целых чисел и выводит на печать сумму элементов этого массива.
Возможно, этот пример чуть более сложный, чем необходимо для того, чтобы продемонстрировать использование классов, наследования и потоков ввода-вывода. Листинг П.б. Пример суммирования элементов массива на языке Сч+ 1 У тпс1нбе <вггеаа П> 2 7! ЭГО ПОТОКИ ВВОда-ВИВОда С<к, 5501О.П таКИЕ рабстаЕт. 3 с1а55 ОатаСопчегт ( 4 ргогесгеоп 5 тпс сопчегысмаг сП) (гетнгп сП-'0':)): 6 с)а55 Оата5(оге: ОагаСопчегЦ 7 риб)тс: В тп( тптста1(сПаг а) 9 (ст-0; 10 гебвгп иве = сопчегс(а):); 11 чоэе эаче(сПаг а) 12 (5(оге[ст+т]-сопчегм а):): 13 тпт ветры пг() ( ст-О: гетигп этан.): 14 тпт ргтптча1() ( гетнгп 5(оге[ст<+]:): 15 тпс эна() 16 (1пс агг5на; 17 аГГ5на 0; 10 ТОГ(от=О;Ст<втВЕ:Ст+ч)аттвоа-аГГэаа<5(ОГЕ[от]; 19 гетнгп аггвна.) 20 рыча(е 21 сопэг )пт аахвтае-д, 22 эпг 5)ае: !!Размер массива 23 тпс с1: !!Текущий индекс пассива 24 тп( всоге[аахэтае]:).
25 аюп() 26 ( ю()д; 27 Оата5(оге х. 2В ипт1е((К-х эп151а1(стп.дегО ))!-О) 29 (тот(3=0;д<к;3<<)х.эаче(стп.де(О ); 30 Тот()-х.ветргтпс(),1 0;]--)сон( х,рюптча1(); 31 сон( « ", 5ОИ-" « х.внаО « еп01, 32 нП1)е(стп.десО !-'тп'):)) Строки й Заголовочный файл 5[геап).П' содержит объявления функций стандартной библиотеки ввода-вывода, в том числе функций с)п и сооы Также можно использовать стандартную библиотеку языка С, подключаемую через заголовочный файл 51(((о.П. при использовании компилятора ст ч фирмы м! стовой заголовочный файл называется 1авттева.П.— Примеч. нилч, рад. Строка 2.
В языке С++ комментарии выглядят подобно комментариям в Аоа. Они начинаются с символов // и распространяются до конца строки. Также можно использовать комментарии языка С вида /* ... */. Строки 3-3. Определяется класс Оа~эСоп/егг.. Строка 4. Все объекты, объявляемые в классе Оа~аСопчегг, будут иметь класс доступа ргосесСее (то есть защищенный). Это означает, что функция сопхегт в строке 5 будет видна в любом классе, производном от класса Оа саСопчегт. Сглрока 5. Функция сопчегь преобразует символ, представляющий цифру, в его числовой эквивалент (например, сопчегг( '1') - Е сопчегИ('3') = 3, ...) так же, как и в программе на языке С, приведенной в листинге П.4. Строка 6.