|
Программирование >> Структура ядра и системные вызовы
Ютассы istrstream, ostrstream и strstream не объявляют никаких только им присущих функций-членов. Ниже приводится пример форматирования данных с использованием классов strstream: II source module: strstream.С #include <iostream.h> #include <strstream.h> main() { double dval; int ival; char wd[20]; static char buf[32] = 45.67 99 Hi ; dval= 45.67, ival=99, wd= Hi istrstream (buf) dval ival wd;, ostrstream (buf, sizeof (buf)) ival <- dval , wd \0 cout buf endl; 99 <- 45.67,Hi return 0; В приведенном выще примере данные (45.67, 99 и Hi) извлекаются из переменной би/и присваиваются соответственно переменным dval, ival и wd с помощью класса istrstream. Это аналогично использованию функции sscanf языка С. В этом примере создается временный объект класса istrstream, который использует buf в качестве внутреннего буфера для извлечения данных. Значения переменных dval, ival и wd вновь помещаются в буфер buf в другом формате с помощью класса ostrstream. Эта операция аналогична использованию функции sprintf языка. С. Обратите внимание, что оператором создается временный объект класса ostrstream, который использует buf в качестве внутреннего буфера для вставки данных. Завершающий символ \0 в операторе необходим для того, чтобы строка, хранящаяся в buf была завершена символом конца строки. Компиляция и пробное выполнение программы дают следующие результаты: % СС strstream.с % а.out 99<-4 5.67,Hi Если конструктору объекта класса ostrstream буфер не указывается, объект создает внутренний динамический массив, предназначенный для хранения входных данных. Пользователь может получить доступ к этому массиву, вызвав функцию ostrstream::str. Однако если данная функция вызвана, динамический массив замораживается . Это значит, что данные посредством объекта strstream больше не могут быть вставлены в динамический массив, и пользователю необходимо освободить массив после окончания операции. Способы применения функции ostrstream::str показаны ниже: #include <iostream.h> ♦include <fstream.h> #include <strstream.h> int main(int argc, char *argv[]) fstream source; if (argc == 1 *argv[l] == -) source.attach(0); присоединить к stdin else source.open(argv[l],ios::in); читать поток ввода и сохранить во внутреннем массиве ostrstream str; for (char c=0; str && source.get(c);) str.put(c); получить доступ к внутреннему массиву char *ptr = str. str О; операции с данными массива освободить массив delete ptr; закрыть поток ввода source.close О; закрыть фа0л 3.5. Заключение в этой главе рассматриваются классы потоков ввода-вывода С++. Совместно с определяемыми системой объектами (с/и, cout, cerr и clog) они широко применяются в большинстве программ на С++, так как позволяют контролировать типы объектов и могут быть расширены для поддержки классов, определяемых пользователем. Поэтому пользователю желательно знать не только их основные, но и более детальные характеристики. В следующей главе рассматриваются некоторые стандартные библиотечные функции языка С. Эти функции не входят ни в стандартные классы С++, ни в функции интерфейсов прикладного программирования UNIX и POSIX, но их необходимо знать, так как они бывают весьма полезны при разработке системных приложений. ГЛАВА Ставдартные библиотечные функции С в языке С определен набор библиотечных функций, которые не имеют прямого соответствия в стандартных классах С++ и интерфейсах прикладного программирования UNIX и POSIX. Эти функции используются для: манипулирования данными, их преобразования и шифрования; определения пользователями функций с переменным числом аргументов; динамического управления памятью; представления показаний системных часов в стандартных форматах даты и времени; получения системной информации. Главными преимуществами стандартных библиотечных функций С являются мобильность и низкие затраты на сопровождение пользовательских приложений. Это обусловлено тем, что в большинстве систем (UNIX и другие), которые поддерживают С, применяется один и тот же набор стандартных библиотечных функций С. Эти функции должны иметь одни и те же прототипы и вести себя в разных системах одинаково. Кроме того, библиотечные функции не подвержены частым изменениям, поэтому программы, в которых они используются, легки в сопровождении. Наконец, некоторые из этих библиотечных функций соответствуют стандарту С Американского национального института стандартов (ANSI С), благодаря чему они приемлемы для всех систем, соответствующих этому стандарту. Следовательно, чтобы сократить затраты и время на разработку приложений, рекомендуется использовать библиотечные функции С всякий раз, когда это оказывается возможным. в этой главе описываются основные библиотечные функции, определенные в стандарте ANSI С, и некоторые библиотечные функции, не относя- J щиеся к этому стандарту, но широко доступные во всех UNIX-системах. Мы подробно описываем эти функции для того, чтобы пользователи с их помощью могли сократить время разработки своих приложений, улучшить переносимость программ и упростить их сопровождение. Если переносимость программ и простота их сопровождения являются решающими факторами Ш1я разрабатываемого вами приложения, то рекомендуется максимально использовать стандартные классы С++ и стандартные биб.яиотечные функции С, а системные интерфейсы прикладного программирования применять только в случае необходимости. Если же ваши приложения должны отличаться высоким быстродействием или если они требуют интенсивного взаимодействия с ядром, то целесообразней будет использовать системные API. Стандартные библиотечные функции С объявляются в наборе файлов заголовков, которые в UNIX-системах обычно расположены в каталоге /usr/include. Архивы и совместно используемые библиотеки, которые содержат объектный код данных библиотечных функций,- это соответственно ИЬс.а и libc.co. В UNIX-системах указанные библиотеки обычно находятся в каталоге /usr/Ub. В нескольких следующих разделах описываются библиотечные функции ANSI С, определенные в файлах заголовков, перечисленных ниже: <stdio.h> <stdlib.h> <stnng.h> <memory.h> if <malIoc.h> <time.h> <assert.h> <stdarg.li> ЛГУ <getopt.h> <setjmp.h> II N Кроме указанных, в большинстве UNIX-систем есть файлы заголовков, которые не определены в ANSI С: # I<pwd.h>: <8Ф.11>- fi- <crypt.h> В этих файлах заголовков объявляются функции, которые помогают получить доступ к информации о бюджетах пользователей и групп в UNIX-системах. В указанных системах они определены в библиотеке libc.a. Мы описываем эти заголовки в расчете на то, что пользователи сочтут их полезными для разработки приложений. 4.1. <stdio.h> в файле заголовков <stdio.h> объявляется тип данных FILE, который используется в С-программах для обозначения потоковых файлов, или просто потоков, т.е. файлов, обмен с которыми осуществляется с помощью функций потокового ввода-вывода. Имеется также набор макрокоманд и функций, предназначенных для манипулирования потоковыми файлами. Ниже приведены некоторые из этих макрокоманд и функций, которые уже должны быть знакомы читателям. Потоковая функция или макрокоманда Назначение fopen Открывает поток для чтения и (или) записи fclose Закрывает поток fread Читает блок данных из потока fgets Читает строку текста из потока fscanf Читает форматированные данные из потока fwrite Записывает блок данных в поток fputs Записывает строку текста в поток fprintf Записывает форматированные данные в поток fseek Перемещает указатель чтения или записи в потоке ffell Возвращает текущую позицию в потоке, начиная с кото- рой будет выполнена следующая операция чтения или записи. Возвращаемое значение - это количество байтов смещения относительно начала потока freopen Повторно использует указатель потока для ссылки на новый файл fdopen Открывает потоковый файл с указанным дескриптором feof Макрокоманда, которая возвращает ненулевое значение, если в данном потоке обнаружен символ конца файла, в противном случае - нулевое значение terror Макрокоманда, которая возвращает ненулевое значение, если в данном потоке была обнаружена ошибка или символ конца файла, в противном случае - нулевое значение clearerr М акрокоманда, которая сбрасывает флаг наличия ошибок в данном потоке епо Макрокоманда, которая возвращает дескриптор данного потокового файла
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |