Как поймать невозможность преобразоваия?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Чего здесь:

Код: Выделить всё

double Result;
std::wstringstream Buffer;
Buffer<<Value;
Buffer>>Result;
return Result;
не хватает, чтоб поймать невозможность преобразования и наличие недопустимых символов?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Din666
Сообщения: 52
Зарегистрирован: 17 июл 2015, 13:25
Откуда: Moscow
Контактная информация:

не уверен что на все ситуации но:

Код: Выделить всё

if ( (Buffer>>Result).fail() ) {
    // ошибка
}
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Не понял. Член fail здесь вообще чей?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Потока, который возвращает оператор >>.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Если хоть часть строки от начала или ведущих пробелов может быть преобразована, то не ловит ни так, ни

Код: Выделить всё

Buffer<<Value;
if (Buffer.fail())
{
 // Ошибка
}
else
{
 Buffer>>Result;
}
, ни

Код: Выделить всё

if ((Buffer<<Value).fail())
{
 // Ошибка
}
else
{
 Buffer>>Result;
}
, а преобразвывает эту часть. Можно как то поймать строки вроде "23w", или "13e*3"?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Кажется решил:

Код: Выделить всё

double Result;
std::stringstream Buffer;
std::string Value;
std::string s;
std::cin >> Value;
Buffer << Value;
if (((Buffer>>Result).fail()) || (!(Buffer.eof())))
{
   //Ошибка
}
Гарантирован ли здесь порядок вычисления fail и eof?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Гарантирован.

Более того, такое огромное количество скобок попросту излишне: у всех логических операций есть гарантированный порядок вычислений.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Более того, такое огромное количество скобок попросту излишне: у всех логических операций есть гарантированный порядок вычислений.
Каким боком эти скобки к порядку вычисления логики? Избыточные скобки помогают читать и составлять выражения, не тратя времени на вспоминание приоритетов, но ни как не влияют на код.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Гарантирован.
Слева на право?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):Каким боком эти скобки к порядку вычисления логики? Избыточные скобки помогают читать и составлять выражения, не тратя времени на вспоминание приоритетов, но ни как не влияют на код.
А я и не говорил, что они влияют на код в данном случае. Я сказал, что они избыточны.

Как по-мне, добавление скобок по каждому чиху, наоборот, делает внешний вид выражения слишком громоздким и, как следствие, ухудшает читабельность. К тому же наличие дополнительных скобок, как правило, говорит о том, что программист хочет изменить стандартный порядок вычисления, и если смены порядка на самом деле не обнаруживается, то это сбивает с толку того, кто читает потом код. Читатель начинает искать где же он просчитался, и тратит на это дополнительное время. И, кстати, порядок вспоминать не нужно, если ты его и так знаешь. А если не знаешь, то правильнее выучить, а не скобки тулить. Вот второй раз уже напарываюсь на твой аргумент, что вспоминать что-то - это плохо. Прошлый раз ты про называние стандартной функции писал то же самое. Неужели я один такой мастодонт программирования, что для меня подобные аргументы дики и смешны? Понимаешь, если пишешь много кода, то знания как о стандартных функциях, так и о порядке вычисления логических выражений, откладываются сами-собой даже без специальной зубрёжки. Тут как бы вывод сам напрашивается :)
Сионист писал(а):Слева на право?
Да, слева направо.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить