c++ - C++ 中的列式文本抓取

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

这似乎没有捕获任何值(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/

相关文章:

c++ - 如果基类构造函数受到保护,为什么我们不能在派生类函数中创建基类的对象

java开发在linux下设置路径

计算 C 列表中的符号变化

c++ - 字段类型不完整?

c++ - pthread互斥体: error LNK2019: unresolved external symbol c++

jquery - 如何获取 IE8 中文件类型输入的文件名

java - 需要在for循环中声明变量

javascript - 如何在VANILLA JS中的for循环内等待事件?

c++ - 如何创建一个可以初始化 C++ 数据类型的类?

c - write() 在两种情况下表现不同