从istream中获取下一个float

Get next float from an istream?

本文关键字:下一个 float 获取 istream      更新时间:2023-10-16

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"

C++中的I/O流函数(以及C中的stdio函数)设计用于读取格式化的输入。也就是说,它们是为读取程序所期望的类型的值而定制的。没有任何东西试图从流中读取值,只接受特定类型,而丢弃其他值。此外,"浮点"可能是什么还有些不清楚:例如,"+1"对一些人来说是一个非常好的"浮点",而另一些人可能希望它至少包含一个小数点,甚至可能在小数点后至少一位。

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];
        }
    }
}