c++中csv文件的写入和读取
env_ 是开放空间规划前对环境信息的存储 用来给MyEnvironment my_env;赋值
什么是CSV?
CSV 是一种以纯文本形式存储的表格数据,具体介绍如下(来自维基百科):
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。
简单的说,CSV 是一种通用的、相对简单的表格文件格式,最广泛的应用就是在不同程序之间转移表格数据。值得注意的是,CSV 并没有一种单一的、定义明确的格式(虽然有一个 RFC 4180 的定义),一般地,CSV 文件具有如下特征:
- 纯文本,使用某个特定的字符集保存,例如 ASCII、Unicode 等
- 由一条条记录组成,一般每一行代表一条记录
- 每条记录被分隔符划分为不同的字段,最常见的分隔符是逗号,毕竟其中文名叫逗号分隔值:)
- 每条记录相同的字段序列
因为CSV 文件并没有一种单一的、定义明确的格式,因此下面的内容以最常见的格式为例,即逗号(,)分隔字段,换行符(\n)分隔记录。
示例主要将一个二维数组存入到CSV文件中。
#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;
int main()
{
int a[2][3] = { 1, 2, 3, 4, 1,2};
int lines, row, column;
lines = sizeof(a) / sizeof(a[0][0]); // 数组数据总数
row = sizeof(a) / sizeof(a[0]); // 行
column = lines / row; // 列
// 向csv文档中写入数据
ofstream dataFile;
dataFile.open("test.csv", ios::out | ios::trunc);
dataFile << "x"
<< ","
<< "y"
<< ","
<< "z"
<< std::endl;
for (int i = 0; i < row; i = i + 1)
{
for (int j = 0; j < column; j = j + 1)
{
dataFile << a[i][j] << ","; // 写入数据
}
dataFile << endl; // 换行
}
dataFile.close(); // 关闭文档
}
输出结果:
常见的CSV文件的分隔符是逗号(,),被分隔符分开的字段会位于不同的列。在上述语句中,x、y、z被分隔符分开,因此这个CSV文件共有3列,分别是x、y、z。
CSV文件是由一条条记录组成的,常见划分不同记录的符号是换行符(\n)。在上述语句中,x、y、z 分别属于同一行上的不同三列,很显然,这条记录是表头。
用Plotjuggler显示机器人路径
保存机器人轨迹为CSV文件
使用下面的示例代码来存储机器人的位置。存储其他数据也可以用类似的方法。
#include <fstream>
#include <ios>
#include <iostream>
#include <string>
#include <vector>
struct Pose
{
double x;
double y;
}
void saveCvsFile(std::string file_name, std::vector<Pose> path)
{
std::ofstream outfile;
outfile.open(file_name.c_str(), std::ios::trunc);
outfile << "x"
<< ","
<< "y"
<< ","
<< "yaw"
<< ","
<< "num" << std::endl;
int num_count = 0;
for (int i = 0; i < path->size(); ++i)
{
outfile << path->at(i).x << "," << path->at(i).y << ","
<< path->at(i).yaw << "," << num_count << std::endl;
num_count++;
}
outfile.close();
}
在plotjugger中显示路径:
参考文章
我们向往远方,却忽略了此刻的美丽