我正在尝试打开文件夹和子文件夹中的所有文本文件,我将其作为参数提供给程序并在其中搜索文本。现在,如果我使用。而不是路径,它打开我想要的文件。但是,只要我将计算机中的任何其他文件夹作为参数(而不是目标文件的那个),它就不会打开文件。我该如何解决?我有Windows,我使用MinGw作为编译器。
#include <iostream>
#include <cstdlib>
#include "boost/program_options.hpp"
#include "boost/filesystem.hpp"
#include <iterator>
#include <fstream>
namespace po = boost::program_options;
using namespace std;
using namespace boost;
using namespace boost::filesystem;
int main (int argc, char* argv[]) {
// Declare the supported options.
po::options_description desc("Allowed options");
desc.add_options()
("folder", po::value<std::string>(), "find files in this folder")
("text", po::value<std::string>(), "text that will be searched for");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
filesystem::path current_dir (vm["folder"].as<string>());
filesystem:: recursive_directory_iterator end_itr;//recursive lisatud
for ( filesystem::recursive_directory_iterator itr( current_dir );
itr != end_itr;
++itr )
{
//cout << itr->path ().filename () << endl;
if(itr->path().filename().extension()==".txt"||itr->path().filename().extension()==".docx"||itr->path().filename().extension()==".doc"){
ifstream inFile(itr->path().filename().string());
//ifstream inFile("c:\\somefile.txt"); //this would open file
cout<<itr->path().filename().string()<<endl; //this prints out all the file names without path, like somefile2.txt for example
while ( inFile )
{
std::string s;
std::getline( inFile, s );
if (inFile){
std::cout << s << "\n";
if(s.find(vm["text"].as<string>())!= string::npos){
cout<<"found it"<<endl;
}
}
}
}
}
return EXIT_SUCCESS;
}
答案 0 :(得分:3)
问题在于:
ifstream inFile(itr->path().filename().string())
或更具体地说,itr->path().filename()
只返回文件的名称,而不是完整路径到该文件。如果该文件不在程序的当前工作目录中,则打开它时会出现问题:找不到该名称的文件,或者找到同名的本地文件,它不是你真正想要的文件!
虽然您正在执行递归目录迭代,但您当前的工作目录不会发生变化。
取消引用时, itr->path()
会返回boost::filesystem::path
的实例...可能会找到该类的文档here。我相信你想做的是
ifstream inFile(itr->path().c_str());
然而,这可能不是规范或最有效的方式。