如何在 C++ 中遍历目录时对数据进行分组

How to group data while iterating through a directory in c++

我有一个包含 15 个文件夹的目录,每个文件夹有 100 个文本文件。在每个文本文件中包含一列数字。

我需要这些数字来做一些计算,但我不知道如何获得它。我在考虑二维向量,但我需要不同类型的数据结构(文件夹名称的字符串和数字的整数)。

我的最佳解决方案是什么?d

到目前为止我得到的是一个代码,它将通过给定的路径搜索所有文件。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
#include <tuple>
#include <boost/filesystem.hpp>
#include<dirent.h>

using namespace std;

namespace fs = boost::filesyst

// prototype to search all the files by given it a path
vector<double> getFilesFromDirectory(const fs::path& startDirectory);

int main()
{   // the directory
    string dir =  "/home/...";

    // testing to call my methode
    vector<double> myDataStructure = getFilesFromDirectory(dir);

    // print out the value of myDataStructure
    for (auto it = myDataStructure.begin(); it != myDataStructure.end(); it++)
    {
        cout << *it << " " << endl;
    }

    return 0;
}

// methode to search all the files by given it a path
vector<double> getFilesFromDirectory(const fs::path& startDirectory) 
{
    vector<double> di; 

    // First check if the start path exists
    if (!fs::exists(startDirectory) || !fs::is_directory(startDirectory))
    {
        cout << "Given path not a directory or does not exist" << endl;
        exit(1);
    }

    // Create iterators for iterating all entries in the directory
    fs::recursive_directory_iterator it(startDirectory); // Directory iterator at the start of the directory
    fs::recursive_directory_iterator end; // Directory iterator by default at the end

    // Iterate all entries in the directory and sub directories
    while (it != end)
    {
        // Print leading spaces
        for (int i = 0; i < it.level(); i++)
            cout << "";

        // Check if the directory entry is an directory
        // When directory, print directory name.
        // Else print just the file name.
        if (fs::is_directory(it->status()))
        {
            // print out the path file
            cout << it->path() << endl; 
        }
        else
        { 
            cout << it->path().filename() << endl;

            // test
            di = getValueFromFile(it->path().c_str());

            // test, here I want to group the numbers of the file
            // and each name of the folder
            for(int i = 0; i < 15; i++)
            {
                di.push_back(mi(fs::basename(it->path()), it->path().c_str());
            }
        }

        // When a symbolic link, don't iterate it. Can cause infinite loop.
        if (fs::is_symlink(it->status()))
            it.no_push();

        // Next directory entry
        it++;
    }  
    return di;
}

如果我对问题的理解正确,我会写一个 class(或结构)来保存每个文件的内容:

包含路径的字符串: 包含该文件列中表示的每个值的向量

在您的主程序中,包含您创建的每个对象的向量。

定义:

#ifndef __COLVALS_HPP__
#define __COLVALS_HPP__

#include <vector>
#include <string>

class ColVals {

private:
  std::vector<double> _colValues;
  std::string         _pathName;

public:
  ColVals(const std::string& pathName);
  ~ColVals() {}

  void appendValue(const double colValue);

  std::vector<double> getValues();

  std::string getPath();
};

#endif // __COLVALS_HPP__

实施:

#include "colvals.hpp"

using namespace std;

ColVals::ColVals(const string& pathName) {
  _pathName = pathName;
}

void ColVals::appendValue(const double colValue) {
  _colValues.push_back(colValue);
}

vector<double> ColVals::getValues() {
  return _colValues;
}

string ColVals::getPath() {
  return _pathName;
}