> f1;getline(fi" />

Оператор std :: stringstream >> не может преобразовать строку в число с плавающей точкой

c++ stringstream

575 просмотра

1 ответ

Я не могу понять, почему второй >> не удается. Я делаю что-то не так или отсутствует какой-то код?

std::ifstream file;
std::stringstream ss;
std::string str;
float f1, f2;

file.open("file.txt");
getline(file, str);
ss.str(str);
ss >> f1;

getline(file, str);//when packed inside if(), evalueates to true
ss.str(str);
ss >> f2; //when packed inside if(), evalueates to false - but why it fails?


std::cout<<"str = "<<str<<"\n";
std::cout<<"ss.str() = "<<ss.str()<<"\n";
std::cout<<"f1 = "<<f1<<"\nf2 = "<<f2<<"\n";

файл:

0.120000
0.120000

выход:

str = 0.120000
ss.str() = 0.120000
f1 = 0.12
f2 = 2.06831e+032

Я пробовал этот код на нескольких файлах и, видимо, только 1-я вставка в float работает, файлы имеют пустую строку в конце

редактировать

как указал Дэн, я попытался извлечь поплавки прямо из файла:

file.open("file.txt");
file >> f1;
file >> f2;

работает идеально; также просто код много

Автор: Xeverous Источник Размещён: 08.11.2019 11:06

Ответы (1)


6 плюса

Решение

Вы должны добавить следующее утверждение перед второй попыткой прочитать:

ss.clear(); 

Почему ?

Потому что когда вы читаете первую строку, поток строк содержит "0.120000"и ss>>f1приведет ssк концу файла. Так что флаг eof установлен.

Когда вы сбрасываете содержимое потока строк с помощью str(), вы не сбрасываете флаги состояния, поэтому попытка чтения потерпит неудачу. добавление ss.clear () после сброса содержимого stringstreams исправит эту ситуацию.

Онлайн демо

Автор: Christophe Размещён: 20.08.2016 09:38
Вопросы из категории :
32x32