【C++ 】Struct Data IO

本文介绍了一个C++程序,该程序实现了文件行数计数、空间信息解析及点云数据的读写功能。主要内容包括:计算文件中的行数、获取空间信息并存储为向量、保存点云数据到文件以及从文件中加载点云数据。

1. Struct Data IO

int SpaHunter::CountLines(std::string& data_path)
{
	std::ifstream ReadFile;
	int n = 0;
	std::string tmp;
	ReadFile.open(data_path, std::ios::in);//ios::in 表示以只读的方式读取文件
	if (ReadFile.fail())//文件打开失败:返回0
	{
		return 0;
	}
	else//文件存在
	{
		while (getline(ReadFile, tmp, '\n'))
		{
		      n++;
		}
		ReadFile.close();
		return n;
	}
}

IO Struct Data

void SpaHunter::GetSpaceInfo(std::string space_path,
             std::vector<PlatInfo>& platinfo,
             std::vector<Eigen::Vector3d>& space,
             std::vector<double>& space_x,
             std::vector<double>& space_y,
             std::vector<double>& space_z){
  int line_num = CountLines(space_path);
  // std::cout<<"line_num =" <<line_num<<std::endl;

  std::ifstream pose_file(space_path, std::ios::in);
  if(pose_file.is_open()){
    for(size_t i=0; i<line_num; ++i){
      PlatInfo single_plat_info;
      std::string str;
      std::getline(pose_file,str);
      
      std::istringstream istring(str);
    //   string single;
    //     for(size_t j=0; j<9; ++j){
    //     istring>>single;
    //     std::cout<<single<<std::endl;
    //     // istring>>single;
    //     }
    //   std::cout<<" ---------"<<std::endl;
      istring>>single_plat_info.time_stamp;
      istring>>single_plat_info.position[0];
      istring>>single_plat_info.position[1];
      istring>>single_plat_info.position[2];
      istring>>single_plat_info.quate.x();
      istring>>single_plat_info.quate.y();
      istring>>single_plat_info.quate.z();
      istring>>single_plat_info.quate.w();
      istring>>single_plat_info.frame_id;

      space.emplace_back(single_plat_info.position);
      platinfo.emplace_back(single_plat_info);
    }
    // std::cout<<"space.size = "<< space.size() <<std::endl;
    // std::cout<<"platinfo.size = "<< platinfo.size() <<std::endl;
  }

  // PrintPlatInfos(platinfo);
  for(size_t i=0; i<platinfo.size(); ++i){
    space_x.emplace_back(platinfo[i].position[0]);
    space_y.emplace_back(platinfo[i].position[1]);
    space_z.emplace_back(platinfo[i].position[2]);
  }
}

void SavePointCloud(const std::string&filename,
                                        std::vector<Eigen::Vector3d> point_cloud){
  std::ofstream out(filename,std::ios::out|std::ios::app);
  size_t size =point_cloud.size();
  if(out.is_open()){
//    out << "ply\n";
//    out << "format ascii 1.0\n";
//    out << "comment created by C++ WritePly\n";
//    out << "element vertex " << size << "\n";
//    out << "property float x\n";
//    out << "property float y\n";
//    out << "property float z\n";
//    out << "end_header\n";
    for (int i = 0; i < size; i++) {
      if(point_cloud[i].y()>0 && point_cloud[i].y()<2300){
        out << point_cloud[i].x() << "\t" << point_cloud[i].y() << "\t" << point_cloud[i].z() << "\t\n";
      }
    }
  }
  out.close();
}


void loadPcl(std::string path,std::vector<Eigen::Vector3d>& pcl){
  int line_num = CountLines(path);
  std::cout<<"line_num =" <<line_num<<std::endl;

  std::ifstream pose_file(path, std::ios::in);
  if(!pose_file.is_open()){
    return;
  }
  for (int i = 0; i < line_num; ++i) {
    Eigen::Vector3d point_cloud;
    std::string str;
    std::getline(pose_file,str);
    std::istringstream istring(str);
    istring>>point_cloud.x();
    istring>>point_cloud.y();
    istring>>point_cloud.z();
    pcl.emplace_back(point_cloud);
    //std::cout<< i<<" " <<point_cloud.transpose()<<std::endl;
  }
  std::cout<<"pcl.size = "<< pcl.size() <<std::endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大江东去浪淘尽千古风流人物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值