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

时间:2017-12-31 02:32:11

标签: c++ file input file-io inputstream

我有一个包含近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文件,以便我可以在屏幕上打印有意义的文本。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

鉴于您正在谈论Microsoft Word和&#34;文件夹&#34;,我猜您正在运行Windows。

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

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

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