【问题标题】:How to open file by file in a list of file in C++? [duplicate]如何在 C++ 中的文件列表中逐个打开文件? [复制]
【发布时间】:2018-04-17 21:32:40
【问题描述】:

我习惯用指令只打开一个文件:

ifstream file ("somefile.txt");      //that means that I know the name of my file

现在我有一个很大的目录,里面有很多文件,我的程序应该一个一个地打开所有这些文件。

我该怎么做?

【问题讨论】:

标签: c++ file


【解决方案1】:

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

假设您已经定义:

#include <vector>
#include <string>
typedef std::vector<std::string> stringvec;

opendir()/readdir()/closedir() (POSIX)

#include <sys/types.h>
#include <dirent.h>

void read_directory(const std::string& name, stringvec& v)
{
    DIR* dirp = opendir(name.c_str());
    struct dirent * dp;
    while ((dp = readdir(dirp)) != NULL) {
       v.push_back(dp->d_name);
    }
    closedir(dirp);
}

boost_filesystem

#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());
}

std::文件系统 (C++ 17)

#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());
}

FindFirstFile()/FindNextFile()/FindClose() (Windows)

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

【讨论】:

  • 这是一个很好的答案!只需用 std c++17 补充 boost 即可。
  • 非常感谢您的回答。我是 C++ 初学者,所以这些代码对我来说听起来很奇怪。我认为第一个更易于使用。我有两个问题。第一:一旦我创建了向量(我猜它是 v),我该如何完成我的任务?我是否只使用 ifstream file (v[i]) 之类的东西?第二:我正在尝试运行代码,但是当我执行 typedef 时,它给出了一个错误“尚未声明 stringvec”。
  • @LuigiBernardi,我认为您第二个问题的答案是包含&lt;vector&gt; 和&lt;string&gt;。我已将其添加到我的答案中。
  • 您真好,回复得这么快。你能帮我解决第一个问题吗?
  • 我添加了一个示例程序,@LuigiBernardi。
猜你喜欢
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 2022-11-24
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多