Программирование >>  Структура ядра и системные вызовы 

1 ... 10 11 12 [ 13 ] 14 15 16 ... 98


Ютассы 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 М акрокоманда, которая сбрасывает флаг наличия ошибок

в данном потоке

епо Макрокоманда, которая возвращает дескриптор данного

потокового файла



1 ... 10 11 12 [ 13 ] 14 15 16 ... 98

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика