2011-02-04 9 views
6

Jak mogę automatycznie otwierać i czytać zawartość pliku w danym katalogu z aplikacji C++, nie znając nazwy pliku?Jak mogę automatycznie otworzyć pierwszy plik w folderze przy użyciu C++?

Na przykład (szorstka opis programu):

#include iomanip  
#include dirent.h  
#include fstream 
#include iostream 
#include stdlib.h 

using namespace std; 

int main()    
{ 
     DIR* dir;             
     struct dirent* entry;           
     dir=opendir("C:\\Users\\Toshiba\\Desktop\\links\\");   
     printf("Directory contents: ");        

     for(int i=0; i<3; i++)          
     { 

      entry=readdir(dir);          
      printf("%s\n",entry->d_name);       
     } 
     return 0; 
} 

ten wypisze nazwę pierwszego pliku w tym katalogu. Mój problem polega na tym, jak odczytać zawartość tego konkretnego pliku i zapisać go w dokumencie .txt. Czy może to zrobić ifstream? (Przepraszam za mój zły język angielski).

+7

Twój angielski nie jest tak źle, jak myślisz. Zacząłem zauważać, że ci, którzy są wystarczająco ostrożni, by przepraszać za swoje umiejętności językowe, są tymi samymi, którzy są na tyle ostrożni, że to, o co proszą, ma sens. –

+2

Co to jest "pierwszy plik"? Oczywiście zależy to od kolejności sortowania. Możesz jednak spojrzeć na bibliotekę [boost :: filesystem library] (http://www.boost.org/doc/libs/1_45_0/libs/filesystem/v2/doc/index.htm). Nie jestem świadomy żadnego standardu i między platformami, aby to zrobić. –

+0

Co miałem na myśli to, że masz folder zawierający tysiące plików. Próbuję napisać program, używając tylko C++, aby czytać pliki w tym folderze jeden po drugim i kopiować jego zawartość do dokumentu .txt, a następnie go zapisać. Proces ten zostanie automatycznie wykonany przez program. To, co użytkownik musi zrobić, to po prostu wykonać program. – FCX

Odpowiedz

5

powinien to zrobić

#include <iostream> 
#include <boost/filesystem/operations.hpp> 
#include <boost/filesystem/fstream.hpp> 
using namespace boost::filesystem; 
using namespace std; 

void show_files(const path & directory, bool recurse_into_subdirs = true) 
{ 
    if(exists(directory)) 
    { 
    directory_iterator end ; 
    for(directory_iterator iter(directory) ; iter != end ; ++iter) 
     if (is_directory(*iter)) 
    { 
     cout << iter->native_directory_string() << " (directory)\n" ; 
     if(recurse_into_subdirs) show_files(*iter) ; 
    } 
    else 
     cout << iter->native_file_string() << " (file)\n" ; 
    copyfiles(iter->native_file_string()); 
    } 
} 

void copyfiles(string s) 
{ 
    ifstream inFile; 

    inFile.open(s); 

    if (!inFile.is_open()) 
    { 
    cout << "Unable to open file"; 
    exit(1); // terminate with error 
    } 
    //Display contents 
    string line = ""; 

    //Getline to loop through all lines in file 
    while(getline(inFile,line)) 
    { 
    cout<<line<<endl; // line buffers for every line 
     //here add your code to store this content in any file you want. 
    } 

    inFile.close(); 
} 
int main() 
{ 
    show_files("/usr/share/doc/bind9") ; 
    return 0; 
} 
1

Jeśli jesteś na systemie Windows można użyć FindFirstFile w API Windows. Oto krótki przykład:

HANDLE myHandle; 
WIN32_FIND_DATA findData; 
myHandle = FindFirstFile("C:\\Users\\Toshiba\\Desktop\\links\\*", &findData); 
do { 
    if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){ 
     cout << "Directoryname is " << findData.cFileName << endl; 
    } 
    else{ 
     cout << "Filename is " << findData.cFileName << endl; 
    } 
} while (FindNextFile(myHandle, &findData)); 

przeciwnym razie pójdę z ayushs answer, doładowania działa na systemach Unix, jak również

+1

Dzięki za kod. To działa. Mam inny problem. Po uruchomieniu programu i odczytaniu pliku nie mogę przenieść pliku z jednego katalogu do drugiego za pomocą systemu ("przenieś katalog OldDirectory"). Ponieważ nie mam nazwy pliku, który zamierzam przenieść. Czy jest jakiś sposób, aby użyć nazwy findData.cFileName, tak jak wspomniałeś w kodzie, aby przenieść mój plik do nowej lokalizacji, ale zachowując tę ​​samą nazwę pliku? Przepraszam, jeśli moje pytanie jest mylące. – FCX

+0

"CFileName" nie jest bezwzględną ścieżką do pliku, więc musiałbyś ustawić katalog, w którym znajduje się plik, do twojego [katalogu roboczego] (http://msdn.microsoft.com/en-us/library /aa365530 (VS.85).aspx) lub dołącz do katalogu nazwę pliku i użyj go jako 'OldDirectory'. Ponadto, zamiast używać systemu i chcesz nadal używać Windows API, sprawdź [MoveFile] (http://msdn.microsoft.com/en-us/library/aa365239 (VS.85) .aspx) – Default

Powiązane problemy