» » » Д. Стефенс - C++. Сборник рецептов


Авторские права

Д. Стефенс - C++. Сборник рецептов

Здесь можно скачать бесплатно "Д. Стефенс - C++. Сборник рецептов" в формате fb2, epub, txt, doc, pdf. Жанр: Программирование, издательство КУДИЦ-ПРЕСС, год 2007. Так же Вы можете читать книгу онлайн без регистрации и SMS на сайте LibFox.Ru (ЛибФокс) или прочесть описание и ознакомиться с отзывами.
Д. Стефенс - C++. Сборник рецептов
Рейтинг:
Название:
C++. Сборник рецептов
Автор:
Издательство:
КУДИЦ-ПРЕСС
Год:
2007
ISBN:
5-91136-030-6
Скачать:

99Пожалуйста дождитесь своей очереди, идёт подготовка вашей ссылки для скачивания...

Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.

Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.

Как получить книгу?
Оплатили, но не знаете что делать дальше? Инструкция.

Описание книги "C++. Сборник рецептов"

Описание и краткое содержание "C++. Сборник рецептов" читать бесплатно онлайн.



Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.






Пример 14.4. Заголовочный файл xerces_strings.hpp, используемый для выполнения преобразований между строками Xerces и строками со стандартными символами

#ifndef XERCES_STRINGS_HPP_INCLUDED

#define XERCES_STRINGS_HPP_INCLUDED


#include <string>

#include <boost/scoped_array.hpp>

#include <xercesc/util/XMLString.hpp>


typedef std::basic_string<XMLCh> XercesString;


// Преобразует строку со стандартными символами

// в строку с расширенным набором символов

inline XercesString fromNative(const char* str) {

boost::scoped_array<XMLCh> ptr(xercesc::XMLString::transcode(str));

 return XercesString(ptr.get());

}


// Преобразует строку со стандартными символами

// в строку с расширенным набором символов.

inline XercesString fromNative(const std::string& str) {

 return fromNative(str.c_str());

}


// Преобразует строку с расширенным набором символов

// в строку со стандартными символами.

inline std::string toNative(const XMLCh* str) {

boost::scoped_array<char> ptr(xercesc::XMLString::transcode(str));

 return std::string(ptr.get());

}


// Преобразует строку с расширенным набором символов в строку со стандартными символами.

inline std::string toNative(const XercesString& str) {

 return toNative(str.c_str());

}


#endif // #ifndef XERCES_STRINGS_HPP_INCLUDED

Для выполнения преобразований между строками Xerces и std::wstring просто используйте конструктор std::basic_string, передавая ему два итератора. Например, можно определить следующие две функции.

// Преобразует строку Xerces в строку std::wstring

std::wstring xercesToWstring(const XercesString& str) {

 return std::wstring(str.begin(), str.end());

}


// Преобразует строку std::wstring в строку XercesString

XercesString wstringToXerces(const std::wstring& str) {

 return XercesString(str.begin(), str.end());

}

В этих функциях используется тот факт, что wchar_t и XMLCh являются интегральными типами, каждый из которых может неявно преобразовываться в другой; это должно работать независимо от размера wchar_t, пока не используются значения, выходящие за диапазон XMLCh. Вы можете определить подобные функции, принимающие в качестве аргументов строки в C-стиле, используя конструктор std::basic::string, которому передаются в качестве аргументов массив символов и длина.

Обсуждение

Для представления строк в коде Unicode библиотека Xerces использует последовательности символов XMLCh, завершаемые нулем. Тип XMLCh вводится с помощью typedef как интегральный тип, зависящий от реализации и содержащий не менее 16 бит, которых достаточно для представления символов почти любого языка. Xerces применяет символьную кодировку UTF-16, что подразумевает теоретическую возможность представления некоторых символов в коде Unicode в виде последовательности из нескольких символов XMLCh; однако практически можно считать, что каждый символ XMLCh непосредственно представляет один символ в коде Unicode, т.е. имеет числовое значение символа Unicode.

Одно время тип XMLCh определялся с помощью typedef как wchar_t, что позволяло легко сохранять копию строки Xerces как std::wstring. Однако в настоящее время Xerces определяет XMLCh на всех платформах с помощью typedef как unsigned short. Кроме всего прочего это означает, что на некоторых платформах типы XMLCh и wchar_t имеют разный размер. Поскольку Xerces может изменить в будущем определение XMLCh, нельзя рассчитывать на то, что XMLCh будет идентичен какому-то конкретному типу. Поэтому, если требуется сохранить копию строки Xerces, следует использовать тип std::basic_string<XMLCh>.

При использовании Xerces вам придется часто выполнять преобразования между строками со стандартными символами и строками Xerces; для этой цели в Xerces предусмотрена перегруженная функция transcode(). transcode() может преобразовать строку Unicode в строку со стандартными символами, использующую «родную» кодировку символов, или строку с «родной» кодировкой со стандартными символами в строку Unicode. Однако смысл родной кодировки точно не определен, поэтому если вы программируете в среде, в которой часто используется несколько кодировок символов, то вам придется все взять в свои руки и выполнять преобразования особым образом, используя либо фасет std::codecvt, либо подключаемые службы перекодировки (pluggable transcoding services) библиотеки Xerces, описанные в документации Xerces. Однако во многих случаях вполне достаточно использовать transcode().

Память под возвращаемые функцией transcode() строки, завершающиеся нулем, динамически выделяется при помощи оператора new в форме массива; вам придется строку удалять самому, используя оператор delete[]. Это создает небольшую проблему управления памяти, поскольку обычно требуется копировать строку или записывать ее в поток до ее удаления, а эти операции могут выбросить исключение. Я решаю эту проблему в примере 14.4 с помощью шаблона boost::scoped_array, который динамически выделяет память под массив и автоматически удаляет его при выходе из области видимости, даже если выбрасывается исключение. Например, рассмотрим реализацию функции fromNative.

inline XercesString fromNative(const char* str) {

 boost::scoped_array<XMLCh> ptr(xercesc::XMLString::transcode(str));

 return XercesString(ptr.get());

}

Здесь ptr становится обладателем возвращенной функцией transcode() строки с нулевым завершающим символом и освобождает ее, даже если конструктор XercesString выбрасывает исключение std::bad_alloc.

14.3. Синтаксический анализ сложного документа XML

Проблема

Имеется некоторый набор данных, хранимых в документе XML, внутри которого используется DTD или применяются пространства имен XML. Требуется выполнить синтаксический анализ документа и превратить содержащиеся в нем данные в набор объектов C++.

Решение

Используйте реализацию Xerces в виде программного интерфейса SAX2 (простой программный интерфейс для XML, версия 2.0). Во-первых, создайте класс, производный от xercesc::ContentHandler; этот класс будет получать уведомления с информацией о структуре и содержимом вашего документа XML по мере его анализа. Затем при желании можно создать класс, производный от xercesc::ErrorHandler, для получения предупреждений и сообщений об ошибках. Сконструируйте парсер типа xercesc::SAX2XMLReader, зарегистрируйте экземпляры классов вашего обработчика, используя методы парсера setContentHandler() и setErrorHandler(). Наконец, вызовите метод парсера parse(), передавая в качестве аргумента полное имя файла, в котором содержится ваш документ.

Например, пусть требуется выполнить синтаксический анализ документа XML animals.xml, приведенного в примере 14.1, и сконструировать вектор std::vector объектов Animal, представляющих животных, перечисленных в этом документе. (Определение класса Animal дается в примере 14.2.) В примере 14.3 я показываю, как можно это сделать, используя TinyXml. Для усложнения задачи добавим в документ пространства имен, как показано в примере 14.5.

Пример 14.5. Список цирковых животных, в котором используются пространства имен XML

<?xml version="1.0" encoding="UTF-8"?>

<!- Животные цирка Feldman Family Circus с использованием пространств имен -->

<ffc:animalList xmlns:ffc="http://www.feldman-family-circus.com">

 <ffc:animal>

  <ffc:name>Herby</ffc:name>

  <ffc:species>elephant</ffc:species>

  <ffc:dateOfBirth>1992-04-23</ffc:dateOfBirth>

  <ffc:veterinarian name="Dr. Hal Brown" phone="(801)595-9627"/>

  <ffc:trainer name="Bob Fisk" phone="(801)881-2260"/>

 </ffc:animal>

 <!- и т.д. -->

</ffc:animalList>

Для анализа этого документа с помощью SAX2 определите ContentHandler, как показано в примере 14.6, и ErrorHandler, как показано в примере 14.7. Затем сконструируйте SAX2XMLReader, зарегистрируйте ваши обработчики и запустите парсер. Это проиллюстрировано в примере 14.8.

Пример 14.6. Применение SAX2 ContentHandler для синтаксического анализа документа animals.xml

#include <stdexcept> // runtime_error

#include <vector>

#include <xercesc/sax2/Attributes.hpp>

#include <xercesc/sax2/DefaultHandler.hpp> // Содержит реализации без

                                           // операций для различных

                                           // обработчиков, используемых

#include "xerces_strings.hpp"              // в примере 14.4

#include "animal.hpp"


using namespace std;

using namespace xercesc;


// Возвращает экземпляр Contact, построенный

// на основе заданного набора атрибутов

Contact contactFromAttributes(const Attributes &attrs) {


На Facebook В Твиттере В Instagram В Одноклассниках Мы Вконтакте
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!

Похожие книги на "C++. Сборник рецептов"

Книги похожие на "C++. Сборник рецептов" читать онлайн или скачать бесплатно полные версии.


Понравилась книга? Оставьте Ваш комментарий, поделитесь впечатлениями или расскажите друзьям

Все книги автора Д. Стефенс

Д. Стефенс - все книги автора в одном месте на сайте онлайн библиотеки LibFox.

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Отзывы о "Д. Стефенс - C++. Сборник рецептов"

Отзывы читателей о книге "C++. Сборник рецептов", комментарии и мнения людей о произведении.

А что Вы думаете о книге? Оставьте Ваш отзыв.