有没有办法在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平台上,有一些名为opendir
和readdir
的函数用于相同的目的。
如果您想编写跨平台代码,那么有些库可以在操作系统功能之上提供一个抽象层,例如boost::filesystem
。
以上是关于有没有办法在C ++中读取文件的文件夹?的主要内容,如果未能解决你的问题,请参考以下文章