C ++从文件中读取

时间:2011-11-20 04:07:00

标签: c++

我有一个组织成列的文件,我想这些数据需要存储在类型的向量中以存储每个数据列。

数据如下:

ATOM      1  N   PRO     1     -38.396  -1.525   2.011 -0.18 14.01
ATOM      2  CA  PRO     1     -36.931  -1.372   2.090  0.08 13.02
ATOM      3  C   PRO     1     -36.353  -0.411   1.059  0.35 12.01
ATOM      4  O   PRO     1     -36.988  -0.061   0.086 -0.37 16.00
ATOM      5  CB  PRO     1     -36.368  -2.749   1.735  0.03 14.03
ATOM      6  CG  PRO     1     -37.417  -3.202   0.763  0.01 14.03
ATOM      7  CD  PRO     1     -38.692  -2.893   1.489  0.08 14.03

开头还有一些我不想要的冗余列,如何根据需要选择数据。 有人能指引我走向正确的方向吗?

2 个答案:

答案 0 :(得分:3)

只需读取数据,然后忽略您不关心的值:

std::string c1, c3, c4;
int c2, c5;
double c6, c7, c8, c9, c10;

if (!(input_stream >> c1 >> c2 >> c3 >> c4 >> c5 >> c6 >> c7 >> c8 >> c9 >> c10))
{
    // error
}

如果你想确保你只是从一行读取数据,首先使用getline将行放入一个字符串,然后使用istringstream作为输入流。您需要有办法区分有效数据线和非数据线。假设每个有效数据行以“ATOM”开头,并且以“ATOM”开头的每一行实际上都是有效的数据行,这样做是否安全?如果是这样,您可以使用它来确定该行是否为数据:

for (std::string line; std::getline(file_stream, line); )
{
    std::string c1, c3, c4;
    int c2, c5;
    double c6, c7, c8, c9, c10;

    std::istringstream iss(line);

    iss >> c1;
    if (c1 == "ATOM")
    {
        if (!(iss >> c2 >> c3 >> c4 >> c5 >> c6 >> c7 >> c8 >> c9 >> c10))
        {
            // error
        }
    }
}

答案 1 :(得分:1)

第二个想法:如果您正在为家庭作业寻找一个简单的解决方案,以下不是它,而是......

我讨厌使用C ++ iostream,甚至使用C scanf-family函数进行最简单的I / O操作。让基础知识运行通常不太难,但我必须再次查看详细信息。在任何情况下,如果输入格式错误,生成的代码往往会非常脆弱。

在我看来,对于这样的工作,你应该使用像Ragel这样的工具。

对于纯C ++解决方案,我建议......

  1. 使用getline方法一次读取一行中的输入。
  2. 使用Boost,TR1和C ++ 11中提供的正则表达式工具解释该行。有一个教程here,虽然我只是简单地看了一下。
  3. 由于regex从C ++ 11开始正式成为C ++的一部分,并且Boost已经提供了一段时间的实现,大多数最新的编译器现在应该支持这个 - 你可以总是使用Boost版本。