Получить следующий поплавок от Истрима? - PullRequest
1 голос
/ 13 февраля 2012

Существует ли в STL функция, которая получит следующее число из файла?

например:

Data.txt:
blah blah blah blah blah
blah blah blah blah blah
blah 0.94 blah blah blah

std::istream inputFile(Data.txt);
float myNumber = inputFile.GetNextFloat();

std::cout << myNumber << std::endl; // Prints "0.94"

1 Ответ

1 голос
/ 13 февраля 2012

Потоковые функции ввода / вывода в 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];
        }
    }
}
...