我有一个组织成列的文件,我想这些数据需要存储在类型的向量中以存储每个数据列。
数据如下:
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
开头还有一些我不想要的冗余列,如何根据需要选择数据。 有人能指引我走向正确的方向吗?
答案 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 ++解决方案,我建议......
getline
方法一次读取一行中的输入。由于regex
从C ++ 11开始正式成为C ++的一部分,并且Boost已经提供了一段时间的实现,大多数最新的编译器现在应该支持这个 - 你可以总是使用Boost版本。