我有一个包含近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文件,以便我可以在屏幕上打印有意义的文本。
答案 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平台上,有一些名为opendir
和readdir
的函数用于相同的目的。
如果要编写跨平台代码,有些库在操作系统功能之上提供了一个抽象层,例如boost::filesystem
。