C++ 中的列文本抓取

Columned Text grabbing in c++

本文关键字:文本 抓取 C++      更新时间:2023-10-16

我有一个看起来像下面的文件

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

这似乎没有抓住任何价值

我在这里看到了多个问题。

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

你能向你的橡皮鸭解释一下,在你阅读下一行之前,你期望typePart如何设置为 4?根据您的问题,正如我所指出的那样,您应该阅读每一行,并且仅在第一列为 4 时才执行计算。在这里,您神秘地期望typePart甚至在阅读相关行之前就设置为 4。

总结一下:

  • 使用 std::getline(( 读取文件中的每一行,而不仅仅是前两行。这是为了您正确地执行下一步:

  • 每次调用 std::getline() 后,请检查 good()eof() 以确定std::getline()是否因为到达文件末尾而失败。如果是这样,请在此时停止,否则:

  • 将你的读取行塞进一个std::istringstream,并使用它来实际使用operator>>提取行的片段,如果你喜欢这样解析它的话。或者,使用您喜欢的任何其他方法来解析。

  • 检查typePart是否为 4,然后在提取行的各个部分之后而不是之前执行所有计算。