2011-02-04 11 views
6

¿Cómo puedo abrir y leer automáticamente el contenido de un archivo dentro de un directorio determinado desde una aplicación C++ sin conocer el nombre del archivo?¿Cómo puedo abrir automáticamente el primer archivo en una carpeta usando C++?

Por ejemplo (una descripción aproximada del programa):

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

Esto imprimirá el nombre del primer archivo en ese directorio. Mi problema es cómo leer el contenido de ese archivo en particular y guardarlo en un documento .txt. ¿Puede ifstream hacer eso? (Lo siento por mi mala Inglés.)

+7

Su Inglés no es tan malo como usted piensa. Empecé a notar un patrón que los que son lo suficientemente cuidadosos para disculparse por sus habilidades lingüísticas son los mismos que son lo suficientemente cuidadosos como para que lo que preguntan tenga sentido en primer lugar. –

+2

¿Cuál es "el primer archivo"? Obviamente depende del orden de clasificación. Si lo desea, puede consultar [la biblioteca boost :: filesystem] (http://www.boost.org/doc/libs/1_45_0/libs/filesystem/v2/doc/index.htm). No conozco ningún estándar ni plataforma cruzada para hacerlo. –

+0

Lo que quise decir es que tienes una carpeta que contiene tal vez miles de archivos. Y estoy intentando escribir un programa usando solo C++ para leer los archivos en esa carpeta uno por uno y copiar su contenido en un documento .txt luego guardarlo. Este proceso será hecho automáticamente por el programa. Entonces, lo que el usuario tiene que hacer es simplemente ejecutar el programa. – FCX

Respuesta

5

esto debe hacerlo

#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

Si estás en Windows se puede utilizar el FindFirstFile en la API de Windows. Aquí está un ejemplo corto:

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

De lo contrario me gustaría ir con ayushs answer, Boost funciona para sistemas Unix, así

+1

Gracias por el código. Funciona. Tengo otro problema. Después de que el programa se abra y lea el archivo, no puedo mover el archivo de un directorio a otro usando el sistema ("mover el directorio nuevo de OldDirectory"). Porque no tengo el nombre del archivo que voy a mover. ¿Hay alguna forma de que pueda usar findData.cFileName como mencionas en el código para mover mi archivo a una nueva ubicación pero manteniendo el mismo nombre de archivo? Lo siento si mi pregunta es confusa. – FCX

+0

el 'cFileName' no es la ruta absoluta al archivo, por lo que tendría que establecer el directorio donde está ubicado el archivo en su [directorio de trabajo] (http://msdn.microsoft.com/en-us/library /aa365530(VS.85).aspx), o concat el directorio con el nombre de archivo y usarlo como 'OldDirectory'. Además, en lugar de usar el sistema y desea continuar usando la API de Windows, consulte [MoveFile] (http://msdn.microsoft.com/en-us/library/aa365239 (VS.85) .aspx) – Default

Cuestiones relacionadas