0

我正在通过 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++ 编程

4

1 回答 1

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>

于 2013-10-06T20:03:56.297 回答