我有一个类似于以下内容的文件
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];
这似乎没有抓住任何价值
答案 0 :(得分:0)
我在这里看到了多个问题。
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解释如何将<{1}}设置为4 吗?根据你的问题,当我不知道它时,你应该阅读每一行,并且只在第一列是4时执行计算。这里,你神秘地期望typePart
甚至在你读取行之前被设置为4问题
总结:
使用std :: getline()读取文件中的每一行,而不仅仅是前两行。这是为了让您正确地进行下一步:
AFTER后每次致电typePart
时,请检查std::getline()
或good()
以确定eof()
是否因为您到达了文件的结尾。如果是,请在此时停止,否则:
将您的读取行填入std::getline()
,然后使用它来实际使用std::istringstream
提取行的部分,如果这是您更喜欢解析它的方式。或者,使用您喜欢的任何其他方法来解析。
检查operator>>
是否为4,然后执行所有计算 AFTER ,而不是之前提取行的部分。