我有一个如下所示的文件
61101
test
3 69.7139 65.3935 22.2632
3 69.7708 65.6131 21.467
2 69.8974 66.0987 20.7391
我试图让它跳过前两行,只要第一列不是 4,我就对最后三列进行平均。
这就是我目前正在尝试的方法,但它似乎并没有真正起作用。
getline(frames_file,tempS);
getline(frames_file,tempS);
while(frames_file.good())
{
if(typePart != 4)
{
frames_file >> typePart >> posPart[0] >> posPart[1] >> posPart[2];
numLipid++;
aPos[0] = aPos[0] + posPart[0];
aPos[1] = aPos[1] + posPart[1];
aPos[2] = aPos[2] + posPart[2];
}
}
aPos[0] = aPos[0]/numLipid;
aPos[1] = aPos[1]/numLipid;
aPos[2] = aPos[2]/numLipid;
cout << " " << aPos[0] << " " << aPos[1] << " " << aPos[2];
这似乎没有捕获任何值(value)
最佳答案
我在这里看到了多个问题。
getline(frames_file,tempS);
getline(frames_file,tempS);
while(frames_file.good())
假设文件只包含两行。这里的预期结果是只读这两行,然后完成。
不幸的是,good()
在这里仍然是 true
,因此其余代码将偏离轨道。 good()
,一般来说,表示输入流之前的操作成功了。嗯,这里前面的操作成功了。您成功阅读了这两行。
good()
应在尝试下一次读取操作后 检查,以确定它是成功还是失败。
if(typePart != 4)
{
frames_file >> typePart >> posPart[0] >> posPart[1] >> posPart[2];
你能解释一下你的rubber duck吗?您如何期望 typePart
在阅读下一行之前 被设置为 4?根据你的问题,正如我所理解的那样,你应该阅读每一行,并且只在第一列为 4 时才执行计算。在这里,你甚至在阅读之前神秘地期望 typePart
被设置为 4有问题的行。
总结:
使用 std::getline() 读取文件中的每一行,而不仅仅是前两行。这是为了让您正确地进行下一步:
AFTER 每次调用
std::getline()
时,检查good()
或eof( )
以确定std::getline()
是否因为您到达了文件末尾而失败。如果是,到此为止,否则:将读取的行填充到
std::istringstream
中,然后使用operator>>
使用它实际提取行的片段,如果是这样的话你更喜欢解析它。或者,使用您喜欢的任何其他方法来 parsig。检查
typePart
是否为 4,然后在提取线段之后执行所有计算,而不是之前。
关于c++ - C++ 中的列式文本抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35400692/