преобразование из пустой строки в число с плавающей запятой с использованием stringstream приводит к ненулевому значению

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

В моем коде я беру строку, полную символов ' ', и преобразую ее в число с плавающей запятой, используя stringstream. Это работало нормально (вернуло мне число с нулевым значением), пока я не выполнил еще одно преобразование сразу после этого. Когда после этого выполняется преобразование, значение, хранящееся в ранее преобразованном вещественном числе, равно не нулю, а 4,57048e-41. Я надеюсь, что следующий код более четко объясняет мою проблему.

Я начал с:

std::stringstream ss;
float a;
float b;
for(int i=0; i<LIM; ++i){
    //some other conversions using same stringstream
    //clearing stringstream    
    ss.str( std::string() );
    ss.clear();

    ss << str1;    //string full of empty spaces, length of 5
    ss >> a;
    std::cout << a;//prints zero
}

Это работало просто отлично, но когда я изменил его на

std::stringstream ss;
float a;
float b;
for(int i=0; i<LIM; ++i){
    //some other conversions using same stringstream
    //clearing stringstream    
    ss.str( std::string() );
    ss.clear();

    ss << str1;    //string full of empty spaces, length of 5
    ss >> a;
    std::cout << a;//prints 4.57048e-41

    ss.str ( std::string() );
    ss.clear();

    ss << str2;    //another string full of empty spaces, length of 5
    ss >> b;
    std::cout << b;//prints zero
}

Я использую gcc 4.6.3 со следующими флагами: -o2 -Wall -Wextra -ansi -pedantic

Любая помощь будет принята с благодарностью, но я не хочу использовать двойников.

Большое спасибо!


person xuva    schedule 26.08.2013    source источник


Ответы (1)


Если преобразование завершается неудачей, целевое значение не изменяется. В вашем случае он все еще имеет исходное неинициализированное значение; поэтому его печать дает мусор или другое неопределенное поведение.

Вы должны проверить, удалось ли преобразование:

if (!(ss >> a)) {
    a = 0; // or handle the failure
}

или используйте функции преобразования, такие как std::stof в C++11 или boost::lexical_cast, которые бросают вызов, чтобы указать на ошибку преобразования. (Или, как упоминалось в комментариях, просто установите его на ноль для начала, если вам в противном случае не нужно обнаруживать сбой).

person Mike Seymour    schedule 26.08.2013
comment
Потрясающий! Спасибо Майк!! - person xuva; 26.08.2013
comment
+1 В качестве альтернативы установите значение по умолчанию перед чтением: a = 0; ss >> a; - person David Rodríguez - dribeas; 26.08.2013