2014-10-17 7 views
0

Я пытаюсь прочитать все txt-файлы из папки, включая файлы txt из подкаталогов выбранной папки, используя C++.Как читать все txt-файлы из папки? (включая подпапки)

Я внедрил версию программы, которая читает все текстовые файлы из определенной папки, но не выполняет итерацию ко всем подпапкам.

#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
#include <iterator> 
#include <string> 
#include <dirent.h> 

using namespace std; 

int main() { 

    DIR*  dir; 
    dirent* pdir; 

    dir = opendir("D:/");  // open current directory 

    int number_of_words=0; 
    int text_length = 30; 
    char filename[300]; 
    while (pdir = readdir(dir)) 
    { 
     cout << pdir->d_name << endl; 
     strcpy(filename, "D:/..."); 
     strcat(filename, pdir->d_name); 
     ifstream file(filename); 
     std::istream_iterator<std::string> beg(file), end; 

     number_of_words = distance(beg,end); 

     cout<<"Number of words in file: "<<number_of_words<<endl; 
     ifstream files(filename); 
     char output[30]; 
     if (file.is_open()) 
     { 
      while (!files.eof()) 
      { 
        files >> output; 
        cout<<output<<endl; 
      } 
     } 
     file.close(); 
    } 
    closedir(dir); 
    return 0; 
} 

Что следует изменить для этой программы для поиска txt-файлов в подпапках выбранной папки?

+0

Посмотрите на [Boost, файловая система] (http://www.boost.org/doc/libs/1_56_0/libs/filesystem/doc/tutorial. HTML) –

ответ

0

Я нашел здесь способ проверить, если файл является каталогом: Accessing Directories in C

Что вы должны сделать первый, чтобы поместить свой код внутри функции, позволяет сказать, недействительным п (символ * реж), так что вы можете обрабатывать несколько папок. Затем используйте код, указанный в приведенной выше ссылке, чтобы определить, является ли файл каталогом или нет.

Если это каталог, вызовите f на нем, если это файл txt, сделайте то, что вы хотите сделать.

Будьте внимательны к одному: в каждом каталоге есть каталоги, которые отправят вас в бесконечный цикл. "" указывает на ваш текущий каталог, «..» указывает на родительский каталог, а «~» указывает на домашний каталог. Вероятно, вы захотите исключить их. http://en.wikipedia.org/wiki/Path_%28computing%29

0

Самый простой способ - написать функцию read_one_file() и рекурсивно вызвать его.

read_one_file() выглядит следующим образом:

read_one_file(string filename){ 
    if(/* this file is a directory */){ 
     opendir(filename); 
     while(entry=readdir){ 
      read_one_file(/*entry's filename*/); 
     } 
    }else{ /* this file is a regular file */ 
     /* output the file */ 
    } 
} 
Смежные вопросы