2011-02-04 21 views
6

Belirli bir dizindeki bir dosyanın içeriğini, dosyanın adını bilmeden bir C++ uygulamasından otomatik olarak nasıl açabilir ve okuyabilirim? Örneğinİlk dosyayı C++ kullanarak bir klasörde nasıl otomatik olarak açabilirim?

(programın kaba açıklama):

#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; 
} 

Bu, o dizindeki ilk dosyanın adını yazdırır. Sorunum, söz konusu dosyanın içeriğini okumalı ve bir .txt belgesine nasıl kaydedeceğimizdir. ifstream bunu yapabilir mi? (Benim kötü İngilizce için üzgünüm.)

+7

İngilizceniz düşündüğün kadar kötü değil de unix sistemleri için çalışır. Dil becerilerinden dolayı özür dilemeye yetecek kadar dikkatli olanların, ilk etapta sordukları şeyin mantıklı olduğuna dikkat edenlerin aynı olduğunu fark ettim. –

+2

"İlk dosya" nedir? Açıkçası sıralama düzenine bağlı. Yine de, [boost :: dosya sistemi kütüphanesi] 'ne (http://www.boost.org/doc/libs/1_45_0/libs/filesystem/v2/doc/index.htm) bakmak isteyebilirsiniz. Bunu yapmak için herhangi bir standart ve çapraz platformdan haberdar değilim. –

+0

Demek istediğim, binlerce dosya içeren bir klasörünüzün olmasıydı. Ve sadece bu klasördeki dosyaları tek tek okumak için C++ kullanarak bir program yazmaya çalışıyorum ve içeriğini bir .txt belgesine kopyalayıp kaydedin. Bu işlem program tarafından otomatik olarak yapılacaktır. Yani kullanıcının yapması gereken şey sadece programı yürütmek. – FCX

cevap

5

bu Windows üzerinde iseniz o

#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

Windows API FindFirstFile kullanabilirsiniz yapmalıdır. İşte kısa bir örnektir:

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)); 

Yoksa ben ayushs answer gelirdim, Boost

+1

Kod için teşekkürler. İşe yarıyor. Başka bir problemim var. Program açıldıktan ve dosyayı okuduktan sonra, dosyayı bir dizinden diğerine sistem kullanarak taşıyamıyorum ("OldDirectory NewDirectory" komutunu taşıyın). Çünkü taşıyacağım dosyanın adını bilmiyorum. Dosyamı yeni bir konuma taşımak ancak aynı dosya adını korumak için kodda belirtildiği gibi findData.cFileName kullanmanın bir yolu var mı? Üzgünüm, sorusu kafa karıştırıcıysa. – FCX

+0

'cFileName' dosyanın mutlak yolu değil, bu nedenle dosyanın [çalışma dizini] 'ne (http://msdn.microsoft.com/en-us/library) bulunduğu dizini ayarlamanız gerekir. /aa365530(VS.85).aspx) veya dizini dosya adıyla uydurun ve 'EskiDizin' olarak kullanın. Ayrıca, sistemi kullanmak yerine ve Windows API kullanmaya devam etmek istiyorsanız, [MoveFile] 'a (http://msdn.microsoft.com/en-us/library/aa365239 (VS.85) .aspx) bakın. – Default

İlgili konular