圆柱形文本抓取c ++

时间:2016-02-15 02:38:11

标签: c++ file for-loop

我有一个类似于以下内容的文件

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];

这似乎没有抓住任何价值

1 个答案:

答案 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 ,而不是之前提取行的部分。