我正在通过for循环读取一行中有5个双打的文件并将它们存储到结构的向量中,有时候该行上有少于5个双打。该文件看起来像
111.111 222.222 333.333 444.444 555.555
666.666
777.777(空白)888.888 999.999
struct temp_struct{
double d1,d2,d3,d4,d5
};
vector<temp_struct> data;
for(int i=0;i<3;i++)
File>>data.at(i).d1>>data.at(i).d2>>data.at(i).d3>>data.at(i).d4>>data.at(i).d5;
有没有办法测试666.666之后和777.777和888.888之间的空白区域。
因为现在我正在阅读它的方式,在666.666之后它将转到文件的下一行并读取777.777和888.888 999.999以便结构看起来像 data.at(1).d1 = 666.666 data.at(1).d2 = 777.777 data.at(1).d3 = 888.888和data.at(1).d4 = 999.999我宁愿拥有
data.at(1).d1=666.666, break because of end of line
data.at(2).d1=777.777, data.at(2).d2=0, data.at(3).d3=888.8888
我在VS2010 C ++编程
答案 0 :(得分:1)
解析基于行的文字的常用方法是将std::getline()
与std::istringstream
结合使用,例如:
for (std::string line; std::getline(in, line); ) {
std::istringstream lin(line);
// parse the line using `line`
}
但也有其他方法。例如,可以设置一个流来不考虑换行空格:这样,当遇到换行时尝试读取数字,读取该值的尝试将失败!更改被视为空格的方法是使用自定义版本std::locale
安装自定义std::ctype<char>
对象。