Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 61
Текст из файла (страница 61)
Важно отметить, что в некоторых компиляторах поддерживаются следующие три, несколько иные формы инструкции ая»: аяп ао мноаРузиРак; аып ас кновруицюк 4иаичеозоа~ конец отроки Самоучитель авш ( воеладеввваламооаь ассвиблврних мнетрувцкй ) Здесь ассемблерные инструкции не выделяются кавычками.
Для правильного встраивания ассемблерных инструкций вам понадобится изучить техническую документацию на ваш компилятор. 8 среде программирования М/сговоП Ивиа( С++ для встраивания ассемблерного кода используется инструкция ввт, Зо воем остальном зта инструкция аналогична только что описанной инструкции авт. 1. В этой программе функция йп)со компонуется не как функция С++, а как функция С: // Демонстрация спецификаторв сборки гг(пс!ис)е <говсгеапР ив!пя патеврасе всс)т ехгегп "С" ьпс гипс(ьпт.
х) ) // компонуется как функция С // Теперь функция компонуется как функция С. (пт гипс ().пс х) ( гегцгп х/3; Теперь эта функция может компоноваться с программой, которая компилировалась компилятором С. 2. В представленной ниже программе компилятору сообщается, что функции ПО, ИО и ОО должны компоноваться как функции С: ехгегп "С" ( уо!о ~1 (); )пт г2 ().пс х); с)оцЫе ЙЗ (с)ои)з1е х, шг *р) т 3. В этом фрагменте в функцию йшеО вставляется несколько ассемблерных инструкций: 411 Глава 13.
Прост анства имен ид угие темы // не пытайтесь выполнить эту функцию! уоЫ йспс () аяп ("точ Ьр, вр"); аяп ("рцвЬ ак") у азтп ("тот с1, 4"); /l Для успешного использования встроенного ассемблера вы должны быть опытным программистом на языке ассемблера. Кроме этого, нужно тшательно изучить техническую документацию на ваш компилятор. Изучите те разделы технической документации на ваш компилятор, которые относятся к спецификаторам сборки и интерфейсу с ассемблером.
13.7. Массивы в качестве объектов ввода/вывода Помимо ввода/вывода на экран и в файл, в С++ поддерживается целый ряд функций, в которых в качестве устройств для ввода и вывода используются массивы. Хотя ввод/вывод с использованием массивов (актау-Ьазеа 1/О) в С++ концептуально перекликается с аналогичным вводом/выводом в С (в особенности это касается функций ааеапЩ и аргй1Ц) языка С), ввод/вывод с использованием массивов в С++ более гибкий и полезный, поскольку он позволяет интегрировать в него определенные пользователем типы данных. Хотя охватить все аспекты массивов в качестве объектов ввода/вывода невозможно, здесь рассматриваются их наиболее важные и часто используемые свойства.
Важно понимать, что для реализации ввода/вывода с использованием массивов тоже нужны потоки. Все, что вы узнали о вводе/выводе С++ из глав 8 и 9 применимо и к вводу/выводу с использованием массивов. При этом, чтобы узнать о всех достоинствах массивов в качестве объектов ввода/вывода, вам следует познакомиться с несколькими новыми функциями.. Эти функции предназначены для связывания нужного потока с некоторой Самоучитель С+~- областью памяти.
После того как эта операция выполнена, весь ввод/вывод производится посредством тех самых функций для ввода и вывода, о которых вы уже знаете. Перед тем как начать пользоваться массивами в качестве объектов ввода/вывода, необходимо удостовериться в том, что в вашу программу включен заголовок <я(гя(геаг))>. В этом заголовке определяются классы Ыгя(геат, оя(тя$геяш и я1гяггеа)п, Эти классы образуют, соответственно, основанные на использовании массивов потоки для ввода, вывода и ввода/вывода. Базовым для этих классов является класс юя, поэтому все функции и манипуляторы классов )я1геат, оя$геят и юя$гея)п имеются также и в классах Ыгя(ген, оя$тя$геат и я(гя(геап). Для вывода в символьный массив используйте следующую основную форму конструктора класса оя(гя(геап): озггзггеагп поток взвода (сваг "буФер, зккеавзкзе размер, орепводе режим = коз:; оШ) ) Здесь поток вывода — это поток, который связывается с массивом, заданным через указатель буфер.
Параметр размер определяет размер массива. Параметррежим по умолчанию обычно настроен на обычный режим вывода, но вы можете задать любой, определенный в классе юя, флаг режима вывода. (За подробностями обращайтесь к главе 9.) После того как массив открыт для вывода, символы будут выводиться в массив вплоть до его заполнения. Переполнения массива произойти не может.
Любая попытка переполнения массива приведет к ошибке ввода/вывода. Для определения количества записанных в массив символов используйте приведенную ниже функцию-член рсовпЦ): ~пс рооипС () Функция должна вызываться только в связи с потоком и возвращает она число символов, записанных в массив, включая нулевой символ завершения. Чтобы открыть массив для ввода из него, используйте следующую форму конструктора класса Мгя(геап): гяегвггеатп поток ввода (согяг скзг збуФер) Здесь буфер — это указатель на массив, из которого будут вводиться символы.
Поток ввода обозначен через волок заоди. При считывании входной информации из массива, функция ео)О возвращает истину при достижении конца массива. Чтобы открыть массив для ввода/вывода, используйте следующую форму конструктора класса я(гя(геап): зггзггсагп поток ввод вывод (сваг *буФзр, зекезвзкзе размер, орепвоое режим = Ьоз:: (и ~ л.оз:: осс) ) Глава 18, Пространства имен идругие темы 413 Здесь латок ввод вывод — это поток ввода/вывода, для которого в качестве объекта ввода/вывода через указатель бу4ер задан массив длиной в размер СИМВОЛОВ. Важно помнить, что все описанные ранее функции ввода/вывода работают и с массивами, включая функции ввода/вывода двоичных файлов и функции произвольного доступа. Применение потоковых классов для символьных массивов резко осуждается стандартом Б1апггаге( С++.
Это означает, что хотя сейчас потоковые классы для символьных массивов достаточно широко распространены, в будущих версиях языка С++ они могут не поддерживаться. Для решения тех же задач, для которых предназначены символьные массивы, стандартом Вгапг(аггг С+ч. рекомендуются классы-контейнеры, описанные в главе 14.
1. В этом простом примере показано, как открыть массив для вывода и записать в него данные: // Короткий пример вывода в массив ()1пс1ие(е <1оясгеып> ()апс1пе(е <зсгясгеата> ия1пк патпеярасе ясб; 1п( ткаап () ( сваг Ьиг(255]: 11 буфер для вывода овегясгеап~ оясг(Ьай, ягкеоГ боб)," 11 открытие массива для вывода оясг « "вводувывод через массивы работает с потоками~о"; оялг « "точно так же, как при обычном вводетвыводетп " « 100; оялг « ' ' « 123,23 « '~П'; можно также использовать манипуляторы оясг « )тех « 100 « или флаги формата ожег.зебр(воя::ясаепс111с); оялг « 123.23 « '~п'т ожег « елея; вывод на экран полученной строки сон « Ьпг; ге игп 0; 414 Самоучитель С++ В результате выполнения программы на экран выводится следующее: вводУвывод через массивы работает с потоками точно так же, как при обычном вводе/выводе 100 123.23 64 01.2323е+02 Как вы могли заметить, перегруженные операторы ввода/вывода, встроенные манипуляторы ввода/вывода, функции-члены и флаги формата полностью доступны и для ввода/вывода с использованием массивов.
(Это также относится ко всем манипуляторам и перегруженным операторам ввода/вывода, которые вы создаете для своих классов.) В представленной выше программе с помощью манипулятора епвв в массив специально добавляется завершающий нулевой символ. Будет ли нулевой символ занесен в массив автоматически или нет, зависит от реализации. Поэтому, если это важно для вашей программы, лучше специально записать в массив завершающий нулевой символ.
2. Пример ввода данных из массива: // Пример ввода из массива $1пс1цое <1оеггеащ> 111пс1цс1е <яСгяггеав> ця)пя патеярасе яМ; 1п1 та1п 11 1 сваг Ьн1[) = "Привет 100 123.125 а"; 1еггяггеат 1вгг(ьц~); // открытие массива для ввода из него 1нл 1; с1таг агг180); 11оаВ 1; с1таг су 1ягт » ясг » 1 » 1 » с; соня « ясг « ' ' « 1 « ' « .; соня « ' ' « с « '~п'р Эта программа считывает и воспроизводит данные, содержащиеся в массиве, заданном указателем Ънй 3. Запомните, что массив для ввода, после того как он связан с потоком, становится похожим на файл. Например, в следующей программе для считывания содержимого массива по адресу ЬвГ используются функции еоГО и яеЦ): рлава 13. дространства имен и другие темы У~ демонстрация того факта, что функции еой(» и дек() работают с вводом/выводом, основанным на использовании массивов * ()фпс1пбе <1озггеав> ()1пс1ибе <зггзггеал> из1пд патпеярасе япб; 1пс табп () сЬаг Ьпг [] = "Привет 100 123,125 а"; 1зьгзггеал~ 1зьг(ьпй); сЬаг с; жЬ11е((1згг.еой()) бзгг.дег(с»; фт (! 1ЗЬг.
ЕОй () ) СОПЬ «С; геспгп 0; 4. В следуюцей програилче ввлтолняется ввод данных из массива и вывод данных в массив: Демонстрация ввода/вывода с использованием массивов ()1пс1пбе <1озсгеаа> ()1пс1ибе <зггзлгеатв> иябпд патеярасе ясб; ='пг шаз.п() сЬаг 1оЬий[255)," зсгзггеат )оясг (1оЬпй, ябзеой 1оЬпй); 1оясг « "Это проверка~п"; 1оясг « 100 « Ьех « ' ' « 100 « епбя; сиаг зГг[ВО]; гп 1озГг.декаде(згг, 79); // считывает строку вплоть до ~п 1оякг » бес » 1; // считывает 100 соус « ясг « ' ' « -' « 1оя"г » Ьех » соиС « Ьех« 1; геб тгп 0; Самоучитель Эта программа сначала записывает информацию в массив по адресу 1оЬШ, а затем считывает ее обратно.
Сначала с помощью функции цейвеО строка "Это проверка" целиком считывается в массив, далее считывается десятичное значение 100, а затем шестнадцатеричное Ох64. 1. Модифицируйте пример 1 так, чтобы перед завершением программы на эк- ран было выведено число символов, записанных в массив по адресу ЬвГ. 2. Используя массивы в качестве объектов ввода/вывода, напишите программу для копирования содержимого одного массива в другой. (Конечно это не самый эффективный способ решения подобной задачи.) 3. Используя массивы в качестве обьектов ввода/вывода, напишите программу для преобразования строки, содержащей значение с плавающей точкой, в число с плавающей точкой.
Теперь вам необходимо выполнить следующие упражнения и ответить на вопросы. 1. Что отличает статическую переменную-член от других переменных- членов? 2. Какой заголовок необходимо включить в вашу программу, чтобы в каче- стве объектов ввода/вывода можно было использовать массивы". 3. Не считая того, что при вводе/выводе через массивы память используется в качестве устройства ввода и/или вывода, имеется ли еще какое либо отличие между таким и "обычным" вводом/выводом? 4. Для заданной функции совп$егО напишите инструкцию, позволяющую компилировать эту функцию для сборки с языком С.