Программирование >>  Разработка устойчивых систем 

1 ... 40 41 42 [ 43 ] 44 45 46 ... 196


testDate( 08-10-2003 ): testDate( 8-10-2003 ): testDate( 08 - 10 - 2003 ): testDate( А-10-2003 ): testDate( 0810/2003 ): } III:-

Строковые литералы в ma1n() передаются по ссылке функции testDate(), которая, в свою очередь, упаковывает их в объекты istringstream. На этих объектах проверяется работа операторов чтения, написанных нами для объектов Date. Функция testDateO также в первом приближении проверяет работу оператора записи данных operator ().

Строковые потоки вывода

Строковые потоки вывода представлены объектами ostringstream. Объект содержит символьный буфер с динамически изменяемыми размерами, в котором хранятся все вставленные символы. Чтобы получить отформатированный результат в виде объекта string, вызовите функцию str(). Пример:

: C04:Ostr1ng.cpp Строковые потоки вывода #1nclude <1ostream> #1nclude <sstream> #1 nclude <str1ng> using namespace std:

int mainO { cout type an int. a float and a string: : int i: float f: cin i f:

cin ws: Игнорировать пропуски string stuff:

getlineCcin. stuff); Получение остатка строки ostringstream os: OS integer = 1 endl: OS float = f endl: OS string = stuff endl: string result = os.strO: cout result endl: } III:-

В целом программа напоминает пример Istring.срр, в котором из потока читались числа int и float. Ниже приводится примерный результат (ввод с клавиатуры выделен полужирным шрифтом):

type an int. а float and a string: 10 20.5 the end integer = 10 float = 20.5 string = the end

При передаче байтов в ostringstream применяются те же средства, что и для других потоков вывода: оператор и манипулятор endl. Функция str() при каждом вызове возвращает новый объект string, поэтому базовый объект stringbuf, принадлежащий строковому потоку, остается в прежнем состоянии.



int main(int argc, char* argv[]) { requireArgs(argc. 1.

usage: HTMLStripper2 InputFile ): ifstream in(argv[l]): assure(in. argv[l]):

Прочитать весь файл в строку и удалить HTML ostringstream ss: ss in.rdbufO: try {

string s = ss.strO:

cout stripHTMLTags(s) endl:

return EXIT SUCCESS:

catch (runtime errorS x) { cout X.what О endl: return EXITJAILURE:

} /:-

В предыдущей главе была представлена программа HTMLStripper.cpp, удалявшая из текстового файла теги HTML и специальные символы. Тогда мы пообещали, что представим более элегантное решение с использованием строковых потоков:

: C04:HTMLStripper2.cpp {RunByHand}

{L} ../СОЗ/ReplaceAll

Фильтр для удаления тегов и маркеров HTML

linclude <cstddef>

linclude <cstdlib>

linclude <fstream>

linclude <iostream>

linclude <sstreani>

linclude <stdexcept>

linclude <string>

linclude ../СОЗ/ReplaceAll.h

linclude ../require.h

using namespace std:

strings stripHTMLTags(string& s) throw(runtime error) { size t leftPos:

while ((leftPos = s.find(<)) != string::npos) { size t rightPos = s.find(>, leftPos+1): if (rightPos == string::npos) { ostringstream msg:

msg Incomplete HTML tag starting in position

leftPos; throw runtime error(msg.str());

S.erasedeftPos. rightPos - leftPos + 1):

Удаление всех специальных символов HTML replaceAlKs. &lt; . < ); replaceAlKs. &gt; . > ); replaceAlKs. &amp; . & ); replaceAlKs. Snbsp: . ): И т. д. return s:



В этой программе все содержимое файла читается в строку, для чего результат вызова rdbuf() файлового потока направляется в ostringstream. Далее остается лишь искать пары тегов HTML и удалять их, не беспокоясь о пересечении границ строк, как в предыдущем примере из главы 3.

Следующий пример показывает, как работать с двусторонним (то есть доступным для чтения и записи) строковым потоком:

: C04:StringSeeking.cpp {-bor}{-dnic} Чтение и запись в строковый поток linclude <cassert> linclude <sstreani> linclude <string> using namespace std:

int mainO { string text = We will hook no fish : stringstream ss(text): ss.seekp(0. ios::end): ss before its time. : assert(ss.str() ==

We will hook no fish before its time. ): Замена hook на ship ss.seekg(8. 1os::beg): string word; ss word:

assert(word == hook ); ss.seekp(8. ios::beg): ss ship ;

Замена fish на code ss.seekg(16, ios::beg): ss word;

assert(word == fish ); ss.seekp(16. ios::beg): ss code : assert(ss.str() =-

We will ship no code before its time. ): ss.str( A horse of a different color. ); assert(ss.str() -= A horse of a different color. ); } III:-

Как обычно, для перемещения позиции записи используется функция seekp(), а для перемещения позиции чтения - функция seekg(). Хотя из приведенного примера этого не видно, строковые потоки не так строги, как файловые потоки, и позволяют в любой момент переключиться с чтения на запись. Вам не приходится заново устанавливать текущие позиции записи или сбрасывать поток. В программе также продемонстрирована перегрузка функции str(), заменяющая базовый объект stringbuf потока новой строкой.

Форматирование в потоках вывода

Одной из главных целей при разработке потоков ввода-вывода была простота перемещения и/или форматирования символов. Несомненно, практическая ценность потоков ввода-вывода во многом определяется поддержкой большинства операций, реализуемых функциями printf() языка С. Как будет показано в этом разделе.



1 ... 40 41 42 [ 43 ] 44 45 46 ... 196

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