问题描述:想要读取一个txt文件中的数据。数据是按行进行排列的,想要读取特定行数中的特定列数据。数据如下图:每一行的第一列是时间,后面的几列是附带的信息。如何读取特定行中的某些列数据。
基本思路:假设我们感兴趣的信息是第一列数据为“2019-01-20 23:43:29”后面的三列数据,将txt 文件按行读取后,通过find函数查找“2019-01-20 23:43:29”。一旦查找到,将这一行数据毫不留情的存储下来。因为列与列数据之间的分隔符是table, 当然你也可以利用人工自己查一下后面三列数据的位置。
#include <iostream>
#include <fstream>
#include <cassert>
#include <string>
#include <vector>
using namespace std;
int main()
{
ifstream infile;
infile.open("file.txt"); //将文件流对象与文件连接起来
assert(infile.is_open()); //若失败,则输出错误消息,并终止程序运行
string s;
vector<string> vec; //定义一个容器vec。
string ss = "2019-01-20 23:43:29";
while (getline(infile, s))
{
if (s.find(ss) == 0) //利用find函数查找我们需要的特定行数据。
{
vec.push_back(s); //将行数据进行存储,相当于将我们每一行的所有数据作为一个字符存储起来。
}
}
infile.close(); //关闭文件输入流
vector<double>X;
vector<double>Y;
vector<double>Z;
string x, y, z;
for (int i = 0; i <vec.size(); i++)
{
x = vec[i].substr(20, 13); //substr就是截取字符,20指的是在第几个字符上,13从第20个数据向后截取的长度。
X.push_back(atof(x.c_str())); //string类型转化为double型分为两步,先将string转为字符数组,然后数组转为double。
//c_str将string转为数组,atof将数组转为double。
y = vec[i].substr(34, 12);
Y.push_back(atof(y.c_str()));
z = vec[i].substr(47, 12);
Z.push_back(atof(z.c_str()));
}
}