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";
}
}
}