Потоковые функции ввода / вывода в C ++ (а также функции stdio в C) предназначены для чтения форматированного ввода.То есть они предназначены для чтения значений типов, ожидаемых программой.Нет ничего, что пытается прочитать значения из потока и принять только определенный тип, отбрасывая другие значения.Кроме того, несколько неясно, что может быть «float»: например, «+1» является совершенно хорошим «float» для некоторых, в то время как другие могут захотеть, чтобы он содержал хотя бы десятичную точку, возможно даже хотя бы одну цифру последесятичная точка.
C ++ 2011 и Boost (если у вас нет доступа к реализации C ++ 2011) реализуют регулярные выражения, и вы должны быть в состоянии обнаружить следующее число с плавающей запятой, соответствующее вашему предпочтениюопределение с помощью этого.Вот простая демонстрация этой техники:
#include <iostream>
#include <string>
#include "boost/regex.hpp"
namespace re = boost;
int main()
{
re::regex floatre("^[^-+0-9]*([-+]?[0-9]+\\.[0-9]+)(.*)");
for (std::string line; std::getline(std::cin, line); )
{
re::smatch results;
while (re::regex_match(line, results, floatre))
{
std::cout << " float='" << results[1] << "'\n";
line = results[2];
}
}
}