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

Здесь есть возможность читать онлайн «Д. Стефенс - C++. Сборник рецептов» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2007, ISBN: 2007, Издательство: КУДИЦ-ПРЕСС, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

C++. Сборник рецептов: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «C++. Сборник рецептов»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

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

C++. Сборник рецептов — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «C++. Сборник рецептов», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

В примере 3.7 я написал простую функцию sciToDub, принимающую параметр типа stringи возвращающую содержащийся в ней double, если он допустим. В sciToDubя использую stringstreamследующим образом.

stringstream ss(str); // Конструирование из строки типа string

double d = 0;

ss >> d;

if (ss.fail()) {

string s = "Невозможно отформатировать ";

s += str;

s += " как число!";

throw (s);

}

return (d);

Наиболее важной частью здесь является то, что все, что требуется сделать, — это использовать для чтения из строкового потока в doubleоператор сдвига вправо ( >>), как это делается при чтении из cin.

Ну, это не совсем все , что требуется сделать. Если в stringstreamзаписано значение, которое не может быть записано в переменную в правой части оператора >>, то для потока будет выставлен бит fail. Этот бит можно проверить с помощью функции-члена fail(на самом деле это функция-член basic_ios, который является родительским классом для stringstream). Кроме того, переменная справа от оператора >>в случае ошибки значения не меняет.

Однако с целью обобщения можно избежать написания отдельных версий sciToDubдля типов int, float, doubleи чего-либо еще, что может потребоваться преобразовать, если написать шаблон функции. Рассмотрим такую новую версию.

template

T strToNum(const string& str) {

stringstream ss(str);

T tmp;

ss >> tmp;

if (ss.fail()) {

string s = "Невозможно отформатировать ";

s += str;

s += " как число!";

throw (s);

}

return (tmp);

}

Теперь, чтобы преобразовать stringв числовой тип, можно сделать так.

double d = strToNum("7.0");

float f = strToNum("7.0");

int i = strToNum("7.0");

Также параметром шаблона можно сделать тип символов, но это очень просто сделать, так что я оставляю это в качестве вашего упражнения.

Смотри также

Рецепт 3.2.

3.6. Преобразования между числовыми типами

Проблема

Имеется число одного типа и требуется преобразовать его в другой, как intв shortили наоборот, но при этом необходимо перехватывать все ошибки переполнения (overflow) или потери значимости (underflow), возникающие при работе программы.

Решение

Используйте шаблон класса numeric_castBoost. Он выполняет проверки, которые при переполнениях переменной, принимающей значение, или других ошибках выбрасывают исключение типа bad_numeric_cast. Пример 3.8 показывает, как это выполняется.

Пример 3.8. Безопасное преобразование чисел

#include

#include

using namespace std;

using boost::numeric_cast;

using boost::bad_numeric_cast;

int main() {

// Целые типы

try {

int i = 32767;

short s = numeric_cast(i);

cout << "s = " << s << endl;

i++; // Теперь i выходит за диапазон (если sizeof(short) равен 2)

s = numeric__cast(i);

} catch (bad_numeric_cast& e) {

cerr << e.what() << endl;

}

try {

int i = 300;

unsigned int ui = numeric_cast(i);

cout << ui << endl; // Прекрасно

i *= -1;

ui = numeric_cast(i); // i отрицателен!

} catch (bad_numeric_cast& e) {

cerr << e.what() << endl;

}

try {

double d = 3.14.

int i = numeric_cast(d);

i = numeric_cast(d); // Это отрезает 0.14!

cout << i << endl; // i = 3

} catch (bad_numeric_cast& e) {

cerr << e.what( ) << endl;

}

}

Обсуждение

Вы, вероятно, знаете, что базовые типы C++ имеют различные размеры. Стандарт C++ содержит жесткие указания по относительному размеру типов: intвсегда не короче, чем short int, но он не указывает абсолютных размеров. Это означает, что если взять long intи попытаться записать его значение в shortили попытаться поместить intв unsigned int, то информация о значении переменной-источника, такая как знак или даже часть числового значения, может быть потеряна.

Только знания, что это может привести к проблемам, не достаточно. Вы можете быть ограничены жесткими требованиями по объему и не захотите использовать четыре байта для long, когда можно обойтись двумя байтами для short(если ваша платформа на самом деле использует такие размеры, что очень распространено, но не гарантируется). Из-за ограничений по объему может возникнуть желание попробовать хранить значения в наименьших возможных типах. Если вы любите приключения, но вам нужна страховка, для перехвата потерь данных при работе программы используйте numeric_castиз Boost.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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

Представляем Вашему вниманию похожие книги на «C++. Сборник рецептов» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «C++. Сборник рецептов»

Обсуждение, отзывы о книге «C++. Сборник рецептов» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.