[英]Reading only float values from text file
我有一个文本格式的数据文件。 它有2个栏目,第一个对我来说可以忽略不了,第二个就是我需要的。 该coloum在每一行上具有不同的值,例如字符串,float等。对于某些计算,我只需要浮点此coloum的成员即可。 我遵循这种方式,首先声明一个float数组并读取值,然后使用“ >>”基本命令保存该数组。
问题是当非浮动行到来时,读取功能会损坏。 它将非浮点值读取为“ 0”并另存为该值。 没关系,但是之后即使它是浮点型也将整个值读取为“ 0”。
Datafile.txt(示例)
aa 1.1
bb 2.2
cc 3.0
dd somestring
ee 4.3
ff 4.9
代码(示例)
do
{
dfile >> a >> dat[i];
ofile << dat[i]<<endl;
cout << dat[i]<<endl;
i++;
}while(dfile.eof());
输出文件(示例)
1.1
2.2
3.0
0
0
0
..goes
我想过两种解决问题的方法。 第一个是跳过非浮动行。 第二个是在一段时间内阅读。 因为浮点值在序列中列出。
首先阅读一个字符串,然后尝试转换为数字:
std::string maybeNumber;
while (dfile >> a >> maybeNumber)
{
std::istringstream is(maybeNumber);
float number = 0.0f;
if (is >> number)
{
dat[i] = number;
i++;
}
}
(您不想使用eof
。每个人都认为他们想要使用eof
,但这几乎永远不是他们所需要的。请参阅此问题以获取详细信息。)
没关系,但是之后即使它是浮点型也将整个值读取为“ 0”。
您尚未显示完整的代码,但这听起来像输入流在第一个不可解析的浮点数之后处于错误状态,因此它根本不会读取任何内容。
为了解决该问题,请以std::string
读取每一行,然后将该行拆分为std::vector<std::string>
。 如果向量不包含两个元素,或者第二个元素不是double
,则什么也不做,否则处理该行。
像这样:
std::string line;
while (std::getline(dfile, line))
{
auto const elements = parse(line);
if (size(elements) == 2 && is_double(elements[1]))
{
// process
}
}
现在,您已经在更高的抽象级别上解决了该问题,您所要做的就是实现诸如parse
类的 东西,以及实现is_double
(divide&conquer)之类的东西。
还要注意,默认的C ++浮点类型是double
而不是float
。 如有疑问,请使用double
。
我会使用这样的算法:
对于文件中的每一行:
使用getline和regex_token_iterator
#include <regex>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
int main()
{
std::vector<float> v;
std::regex reg("-?\\d+(\\.\\d+)?");
const char* filename="myfile.txt";
std::ifstream ifs(filename,std::ios::binary);
for(std::string s;std::getline(ifs,s);)
for(std::sregex_token_iterator rgi(s.begin(),s.end(),reg);rgi!=std::sregex_token_iterator();++rgi)
v.push_back(std::stof(rgi->str());
std::copy(v.begin(),v.end(),std::ostream_iterator<float>(std::cout," ");
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.