C++ 如何在C+中的文件列表中逐个打开文件+;?

C++ 如何在C+中的文件列表中逐个打开文件+;?,c++,file,C++,File,我习惯于只打开一个文件,其中包含以下说明: ifstream file ("somefile.txt"); //that means that I know the name of my file 现在我有一个很大的目录,里面有很多文件,我的程序应该一个接一个地打开所有这些文件 我该怎么做呢?以下方法都将使用给定目录中的文件名填充向量 假设您已定义: #include <vector> #include <string> typedef std::vector

我习惯于只打开一个文件,其中包含以下说明:

ifstream file ("somefile.txt");      //that means that I know the name of my file
现在我有一个很大的目录,里面有很多文件,我的程序应该一个接一个地打开所有这些文件


我该怎么做呢?

以下方法都将使用给定目录中的文件名填充向量

假设您已定义:

#include <vector>
#include <string>
typedef std::vector<std::string> stringvec;
#包括
#包括
typedef std::vector stringvec;
opendir()/readdir()/closedir()(POSIX)
#包括
#包括
void read_目录(const std::string&name,stringvec&v)
{
DIR*dirp=opendir(name.c_str());
结构方向*dp;
而((dp=readdir(dirp))!=NULL){
v、 推回(dp->d_名称);
}
closedir(dirp);
}
boost\u文件系统
#包括
结构路径\叶\字符串
{
std::string operator()(const boost::filesystem::directory\u entry&entry)const
{
返回条目.path().leaf().string();
}
};
void read_目录(const std::string&name,stringvec&v)
{
boost::filesystem::path p(名称);
boost::filesystem::directory\u迭代器启动(p);
boost::filesystem::directory\u迭代器end;
std::transform(开始、结束、std::back_inserter(v)、path_leaf_string());
}
文件系统(C++17)
#包括
结构路径\叶\字符串
{
std::string operator()(const std::filesystem::directory\u entry&entry)const
{
返回条目.path().leaf().string();
}
};
void read_目录(const std::string&name,stringvec&v)
{
std::filesystem::path p(名称);
std::filesystem::directory\u迭代器start(p);
std::filesystem::directory\u迭代器end;
std::transform(开始、结束、std::back_inserter(v)、path_leaf_string());
}
FindFirstFile()/FindTextFile()/FindClose()(Windows)
#包括
void read_目录(const std::string&name,stringvec&v)
{
std::字符串模式(名称);
模式。追加(“\\*”);
WIN32_查找_数据;
处理高频风;
if((hFind=FindFirstFile(pattern.c_str(),&data))!=INVALID_HANDLE_值){
做{
v、 推回(data.cFileName);
}while(FindNextFile(hFind,&data)!=0);
FindClose(hFind);
}
}
使用其中一个,然后可以迭代向量并打开文件:

#include <iostream>
#include <fstream>

int main()
{
    const std::string directory = "/my/favourite/directory";
    stringvec v;
    read_directory(directory, v);
    for (auto filename : v) {
        std::string path = directory + "/" + filename;
        std::ifstream ifs(path);
        if (ifs) {
            // Read ifs here
        }
        else {
            std::cerr << "Couldn't open " << path << " for reading\n";
        }
    }
}
#包括
#包括
int main()
{
const std::string directory=“/my/favorite/directory”;
stringvec v;
read_目录(directory,v);
用于(自动文件名:v){
std::string path=目录+“/”+文件名;
std::ifstream ifs(路径);
国际单项体育联合会{
//在这里阅读ifs
}
否则{

STR::CIER使用DiLoad或STD::文件系统,用C++ 17:实际上,描述如何用目录遍历或递归目录TravaSalCar来做这件事!这是一个很好的答案!!只需用STD C++ 17来补充Boost一个。非常感谢你的回答。我是初学者C++用户,所以这些代码听起来很奇怪。我瘦了。k第一个更易于使用。我有两个问题。第一个问题:一旦我创建了向量(我猜它是v),我该如何执行我的任务?我是否只使用ifstream文件(v[I])?第二个问题:我正在尝试运行代码,但当我执行typedef时,它会给我一个错误“stringvec尚未声明”@Luigbernardi,我想你第二个问题的答案应该包括
。我已经在我的答案中添加了这一点。你太好了,回答得这么快。你能帮我解决第一个问题吗?我添加了一个示例程序,@Luigbernardi。
#include <boost/filesystem.hpp>

struct path_leaf_string
{
    std::string operator()(const boost::filesystem::directory_entry& entry) const
    {
        return entry.path().leaf().string();
    }
};

void read_directory(const std::string& name, stringvec& v)
{
    boost::filesystem::path p(name);
    boost::filesystem::directory_iterator start(p);
    boost::filesystem::directory_iterator end;
    std::transform(start, end, std::back_inserter(v), path_leaf_string());
}
#include <filesystem>

struct path_leaf_string
{
    std::string operator()(const std::filesystem::directory_entry& entry) const
    {
        return entry.path().leaf().string();
    }
};

void read_directory(const std::string& name, stringvec& v)
{
    std::filesystem::path p(name);
    std::filesystem::directory_iterator start(p);
    std::filesystem::directory_iterator end;
    std::transform(start, end, std::back_inserter(v), path_leaf_string());
}
#include <windows.h>

void read_directory(const std::string& name, stringvec& v)
{
    std::string pattern(name);
    pattern.append("\\*");
    WIN32_FIND_DATA data;
    HANDLE hFind;
    if ((hFind = FindFirstFile(pattern.c_str(), &data)) != INVALID_HANDLE_VALUE) {
        do {
            v.push_back(data.cFileName);
        } while (FindNextFile(hFind, &data) != 0);
        FindClose(hFind);
    }
}
#include <iostream>
#include <fstream>

int main()
{
    const std::string directory = "/my/favourite/directory";
    stringvec v;
    read_directory(directory, v);
    for (auto filename : v) {
        std::string path = directory + "/" + filename;
        std::ifstream ifs(path);
        if (ifs) {
            // Read ifs here
        }
        else {
            std::cerr << "Couldn't open " << path << " for reading\n";
        }
    }
}