c++从文件中读取
C++ reading from a file
我有一个被组织成列的文件,其中的数据需要存储在类类型的向量中,以存储每个数据列。
数据如下:
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++解决方案,我建议…
- 使用
getline
方法一次读取一行输入。 - 使用Boost、TR1和c++ 11中可用的正则表达式工具解释行。这里有一个教程,虽然我只是简单地看了一下。
由于regex
在c++ 11中正式成为c++的一部分,并且作为Boost的实现已经有一段时间了,大多数最新的编译器现在应该支持它-您可以随时使用Boost版本。
相关文章:
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 读取文件的最后一行并输入到链接列表时出错
- 为什么在读取文件大小时文件IO速度会发生变化
- 读取文件时运行时的未知行为
- 如何逐行读取文件,每行中的内容都用空格分隔并将其写入新文件中
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- C++ 读取文件读取文件不正确
- 读取文件并将其存储在unordered_map中时出现问题
- 读取文件时无法使用 OpenMP 获得加速
- 使用istringstearm和get行缓慢读取文件
- 如何继续读取不同功能中的文件,而不是从头开始再次读取文件?
- 读取文件时引发异常
- 从标准输入读取文件后读取用户输入
- 在读取文件后重置句柄
- 如何在C++编译时读取文件?
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- 读取文件在第二次调用时返回INVALID_HANDLE
- 通过指针读取文件
- 逐行读取文件,并将数据插入变量和数组中