c++从文件中读取

C++ reading from a file

本文关键字:读取 文件 c++      更新时间:2023-10-16

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

数据如下:

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

开头也有一些多余的列,我不希望,我如何根据需要选择数据。有人能告诉我正确的方向吗?

直接读入数据,忽略你不关心的值:

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"开头的行实际上都是一个有效的数据行,这是否安全?如果是,您可以使用它来确定该行是否为data:

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
        }
    }
}

转念一想:如果你正在寻找一个简单的家庭作业解决方案,下面不是它,但是…

我讨厌做任何事情,除了最琐碎的I/O使用c++ iostreams,甚至使用C scanf-family函数。让基本的东西运行起来通常并不难,但我得再查一遍细节。在任何情况下,如果输入格式不好,生成的代码往往非常脆弱。

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

对于一个纯粹的c++解决方案,我建议…

  1. 使用getline方法一次读取一行输入。
  2. 使用Boost、TR1和c++ 11中可用的正则表达式工具解释行。这里有一个教程,虽然我只是简单地看了一下。

由于regex在c++ 11中正式成为c++的一部分,并且作为Boost的实现已经有一段时间了,大多数最新的编译器现在应该支持它-您可以随时使用Boost版本。