C++读取csv文件

初学C++,尝试实现惯性导航+零速修正+卡尔曼滤波

第一步,读取csv中的传感器数据

此处用到C++文件的输入输出控制知识

首先定义声明一个ifstream对象,与文件名关联。ps:关联后相当于找到了文件的地址,可以通过此对象对文件操作

需要包含头文件#include

ifstream _csvInput("csvdata/xxxx.csv")

或者

ifstream _csvInput;
_csvInput.open(csvdata/xxxx.csv)

然后就可以像cin一样操作_csvInput。例如

char ch;
_csvInput >> ch;
char buf[80];
_csvInput >> buf;
_csvInput.getline(buf, 80);
string line;
getline(_csvInput, line);

这里,我读的是传感器数据,csv文件每行,首个为number,其次是三个acc数据,三个gyro数据,三个mag数据

因此使用getline先读到一行数据

定义一行数据为字符串

string _Oneline;

读该文件一行数据

getline(_csvInput, _Oneline);

此时读到的数据存在_Oneline中,此行数据包括了上述四类数据(number,acc[3],gyro[3],mag[3])

此时再声明一个输入的串流对象,和刚刚的ifstream类似,由此可以对_Oneline进行操作

istringstream _Readstr(_Oneline);	

再定义一行中,各个数据由_partOfstr表示

string _partOfstr;

读取由  ','  隔开的各个数据 ,再转化为float型(一行有10个','分开的数据)

for(int i = 0; i < 10; i++)
{	
	getline(_Readstr, _partOfstr, ',');
	data[i] = atof(_partOfstr.c_str());	
		 
}

得到的data[]即是最后的结果。

最后程序

main.cpp

#include "global.h"
#include "ReadData.h"
#include "imu.h"

using namespace std;

int main()
{
	IMUdata imudata;
	//指定文件路径
	const char* path = "csvdata/straightLine_CalInertialAndMag.csv";
	//初始化CSVreader类对象
	CSVreader reader(path);
	//读数据,第一行为列名,不做处理
	reader.readline();
	while(!reader.readline())
	{
		//得到原始数据
		imudata = setIMU(reader.data);
		cout << imudata.acc[0] << endl;
		break;
	}
	//暂停等待用户信号,不然控制台程序会一闪而过
	system("pause");
}

ReadData.cpp

#include "ReadData.h"

//构造函数,初始化文件路径
CSVreader::CSVreader(const char *path)
{
	_csvInput.open(path);
}
//读取csv文件数据
int  CSVreader::readline()
{
	//定义一行数据为字符串
	string _Oneline;
	//读取一行数据
	getline(_csvInput, _Oneline);
	
	//cout << "原始字符串:" << _Oneline << endl;

	//如果读取到首行数据,返回失败
	if (_Oneline[0] == 'P')
		return EXIT_FAILURE;
	//定义字符串流对象
	istringstream _Readstr(_Oneline);	
	//定义一行数据中的各个字串
	string _partOfstr;
	//将一行数据按','分割
	for(int i = 0; i < 10; i++)
	{	
		getline(_Readstr, _partOfstr, ',');
		data[i] = atof(_partOfstr.c_str());	
		 
	}
	//判断是否读完数据
	if ((data[0]||data[1]||data[3]) == 0)
		return EXIT_FAILURE;
	return EXIT_SUCCESS;
}

ReadData.h

#pragma once
#include 
#include 
#include 
#include 
#include 

#include "global.h"

using namespace std;
//定义CSV读类
class CSVreader
{
public:
	CSVreader(const char *);
	int readline();
	float data[10];
private:
	ifstream _csvInput;
};

imu.cpp

#include "imu.h"
//将文件读到的数据传到IMUdata结构体
IMUdata setIMU(float data[])
{
	IMUdata imudata;
	for (int i = 0; i < 3; i++)
	{
		imudata.acc[i] = data[i + 1];
		imudata.gyro[i] = data[i + 4];
		imudata.mag[i] = data[i + 7];
	}
	return imudata;
}

imu.h

#pragma once

struct Time {
	int hour;
	int minute;
	int sec;
	int ms;
};

struct IMUdata {
	float acc[3];
	float gyro[3];
	float mag[3];
	int number;
};

IMUdata setIMU( float data[]);

 

你可能感兴趣的:(C++基础,INS+EKF+ZUPT)