|
Программирование >> Разработка устойчивых систем
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. < . < ); replaceAlKs. > . > ); replaceAlKs. & . & ); 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() языка С. Как будет показано в этом разделе.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |