有没有办法在C ++中读取文件的文件夹?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法在C ++中读取文件的文件夹?相关的知识,希望对你有一定的参考价值。

我有一个包含近200个单词文档的文件夹,我想使用来自库fstream的ifstream fin将它们读入C ++。我有两个问题:

1)fin能够读入.doc文件,但是由于.doc文件不是纯文本,因此会在页面上打印废话。

2)我知道无法使程序自动读入具有不相关文件名的多个文件。

由于这两个问题,我手动浏览每个.doc文件并将它们更改为.txt文件。另外,我正在调用它们1.txt,2.txt,3.txt等,以便我可以在C ++中使用for循环来读取它们(我将循环控制变量i转换为字符串x in每次迭代,并在“x.txt”中读取。

虽然这样可行,但我只完成了83个文件,大约花了一个小时。有没有办法让我让C ++自动读取所有这些文件? C ++必须首先将每个文件更改为.txt文件,以便我可以在屏幕上打印有意义的文本。

答案

对于这些类型的文件/文件系统操作,Boost库非常丰富。请检查以下代码。这基本上会转到保存所有doc文件的文件夹(ws),并遍历其中的所有文件。该代码假定文件夹'ws'只有文件,没有文件夹。获得文件名后,就可以对其进行各种操作。

我不明白你为什么要将扩展名更改为txt,但包含了几行来执行此操作。更改扩展名不会影响其内容。

#include <sstream>
#include <iostream>
#include <boost/filesystem.hpp>

namespace fs = boost::filesystem;

int main(){

    // ref : https://theboostcpplibraries.com/boost.filesystem-paths

    // ws : workspace where you keep all the files
    fs::path ws = fs::path(getenv("HOME")) / "ws";

    // ref : https://theboostcpplibraries.com/boost.filesystem-iterators
    fs::directory_iterator it{ws};

    while (it != fs::directory_iterator{}){
        std::cout << "Processing file < " << *it << " >" << std::endl;
        // ... do other stuff

        // Parse the current filename into its parts, then change the extension to txt
        // ref : https://theboostcpplibraries.com/boost.filesystem-paths
        std::stringstream ss;
        ss << (ws / fs::path(*it).stem()).native() << ".txt";

        fs::path new_path(ss.str());

        std::cout << "Copying into < " << new_path << " >" << std::endl;

        // ref : http://www.boost.org/doc/libs/1_53_0/libs/filesystem/doc/reference.html
        fs::copy_file(*it++, new_path, fs::copy_option::overwrite_if_exists);
    }

    return 0;
}

你可以用这个编译:

g++ -std=c++14 -o main main.cc -lboost_filesystem -lboost_system
另一答案

鉴于您正在谈论Microsoft Word和“文件夹”,我猜您正在运行Windows。

Windows API提供了FirstFirstFile / FindNextFile函数对,允许程序自动查找现有文件的名称。 The official example is named "Listing the Files in a Directory"

在Linux和Unix平台上,有一些名为opendirreaddir的函数用于相同的目的。

如果您想编写跨平台代码,那么有些库可以在操作系统功能之上提供一个抽象层,例如boost::filesystem

以上是关于有没有办法在C ++中读取文件的文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

android怎么在代码里获得系统文件的读写权限

在 C 代码中解压 .xz 文件

有没有办法在 Android.bp 文件中定义 C 语言宏?

在 C 中读取具有不同扩展名的 .txt 文件

读取 JAR 文件外的属性文件

有没有办法在 Ruby 中读取不同的文件类型? [关闭]