Fork me on GitHub

c++之读取文件夹中的文件

前言

做对应于播放rosbag包的离线版本, 读取文件夹中image和pcd来处理, 因此需要读取文件夹下的图像文件, 然后根据图像的名称来读取pcd.

代码

#include <iostream> 
#include <string> 
#include <vector> 
#include <fstream> 
#include <sstream>
#include <dirent.h>

// 查找文件夹下的制定文件, 如png, pcd文件, 同时输出的按照文件名排名
bool getFileNames(const std::string& path, const std::string& sub_name, std::vector<std::string>& file_name_v)
{
  file_name_v.clear();
  // find
  DIR* p_dir;
  struct dirent* ptr;
  if (!(p_dir = opendir(path.c_str())))
  {
    WARN << "file path don't exist!" << REND;
    return false;
  }
  std::string file_name;
  while ((ptr = readdir(p_dir)) != 0)
  {
    file_name = ptr->d_name;
    if (file_name.find(sub_name) != -1)  //没有找到返回-1
    {
      file_name_v.emplace_back(file_name);
    }
  }
  closedir(p_dir);

  if (file_name_v.empty())
  {
    WARN << "no file in file path!" << REND;
    return false;
  }

  // TODO: 按照string方式排序, 如何按照int方式排序
  std::sort(file_name_v.begin(), file_name_v.end());
  return true;
}

查找path下的文件, 保证该文件名包含sub_name, 最后对file_name_v进行排序.

bool offlinePattern(ros::NodeHandle& nh, cv::FileStorage& fs_reader)
{
  std::string data_path;
  fs_reader["data_path"] >> data_path;
  if (data_path.empty())
  {
    WARN << "data path is empty!" << REND;
    return false;
  }
  INFO << "data path: " << data_path << REND;
  fs_reader.release();

  const std::string image_sub_name = "jpeg";
  std::vector<std::string> image_file_name_v;
  if (!getFileNames(data_path, image_sub_name, image_file_name_v))
  {
    return false;
  }
  INFO << "data files size: " << image_file_name_v.size() << REND;

  // process image and pcd one by one
  std::string image_file_name, pcd_file_name;
  cv::Mat input_image;
  pcl::PointCloud<pcl::PointXYZI>::Ptr input_cloud_ptr(new pcl::PointCloud<pcl::PointXYZI>);
  for (size_t i = 0; i < image_file_name_v.size(); ++i)
  {
    image_file_name = image_file_name_v[i];
    int pose = image_file_name.find_first_of(".");
    std::string sub_name = image_file_name.substr(0, pose);
    pcd_file_name = sub_name + ".pcd";
    input_image = cv::imread(data_path + "/" + image_file_name);
    pcl::io::loadPCDFile(data_path + "/" + pcd_file_name, *input_cloud_ptr);
  }
}

使用std::string的函数提取image_file_name中的名字, 比如/home/test/11.png, 则得到/home/test/11这个值.

int pose = image_file_name.find_first_of(".");
std::string sub_name = image_file_name.substr(0, pose);

参考

注: 第二个参考是windows下的.

posted @ 2021-06-28 14:55  chrislzy  阅读(529)  评论(0编辑  收藏  举报