How to do that after reading a file "txt" it read another then

2

How to do after reading the file txt check if it has a next file txt , I know that to read the file it suffices:

ifstream Arquivo;
Arquivo.open("teste.txt");
while ()
{
   // leitura
}

After reading this file, check if you have another file, if it has it will read this file, and so on.

    
asked by anonymous 21.05.2015 / 21:09

2 answers

3

One way to list the files is through the FindFirstFile and FindNextFile (Windows):

#include <windows.h> /* Para usar as funções de busca de arquivos */
#include <vector>    /* Para usar */
#include <sstream>   /* Para usar o Stringstream */
#include <iostream>  /* Para manipular a entrada/saída de streams */
#include <fstream>   /* Para usar o ifstream */
....
using namespace std;
...
vector<string> ProcurarArquivos(string diretorio) {
    vector<string> arquivos;                      /* Vetor que irá armazenar os resultados temporários */
    string busca = diretorio + "\*.txt";         /* Cria o filtro, no diretório será encontrado somente arquivos .txt */
    HANDLE hFind;                                 /* Identificador da pesquisa */
    WIN32_FIND_DATA data;                         /* Estrutura que conterá informações dos arquivos */
    hFind = FindFirstFile(busca.c_str(), &data);  /* Procura pelo primeiro arquivo */
    if (hFind != INVALID_HANDLE_VALUE) {          /* Se a função não falhar */
        do {
            arquivos.push_back(data.cFileName);   /* Armazena no vetor o nome do arquivo encontrado */
        } while (FindNextFile(hFind, &data));     /* Procura pelo próximo arquivo */
    FindClose(hFind);                             /* Fecha o identificador da pesquisa */
    }
    return arquivos;                              /* Retorna o vetor como resultado */
}

To read the contents of the file and return in a string , do:

string LerAquivo(string arquivo) {
    ifstream ifs;                                          /* Stream usada para fazer operações em arquivos */
    ifs.exceptions (ifstream::failbit | ifstream::badbit); /* Define quais exceções podem ser lançadas */
    try {                                                  /* Tenta executar o código abaixo */
        ifs.open(arquivo.c_str());                         /* Abre o arquivo */
        stringstream ss;                                   /* Stringstream que vai conter o resultado */
        ss << ifs.rdbuf();                                 /* Lê o buffer do stream e coloca no Stringstream */
        string str = ss.str();                             /* Coloca numa string o resultado do Stringstream */
        return str;                                        /* Retorna a string */
    }
    catch (ifstream::failure e) {                          /* Se houver erros em relação a leitura dos arquivos */
                                                           /* Fazer alguma coisa aqui caso ocorram erros */
        return "";                                         /* Retorna uma string vazia */
    }
}

To get the path of the application use the GetModuleFileName :

string DiretorioDaAplicacao() {
    char buffer[MAX_PATH];                        /* Cria um buffer com tamanho máximo para um diretório */
    GetModuleFileName(NULL, buffer, MAX_PATH);    /* Para retornar o caminho completo do executável */
    int pos = string(buffer).find_last_of("\/"); /* Captura a posição da última barra "/" */
    return string(buffer).substr(0, pos);         /* Extraí tudo desde o início até o ponto onde foi encontrado a barra "/" */
}

To extract only the file name, use the function:

string ExtrairNomeDoArquivo(string caminho) {
    int indice = caminho.rfind('/');              /* Encontra o índice da última ocorrência da barra "/" */
    return caminho.substr(indice + 1);            /* Extraí tudo a partir do índice da barra "/" */
}

Note : It works only on Windows, and there are times when this function might fail.

Example usage:

int main() {
    string Diretorio = DiretorioDaAplicacao();             /* Captura o diretório da aplicação */
    vector<string> arquivos = ProcurarArquivos(Diretorio); /* Cria um vetor que armazenará os o caminho dos arquivos encontrados */
    for (vector<string>::iterator i = arquivos.begin(); i != arquivos.end(); i++) { /* Faz a iteração sobre o vetor "arquivos" */
            string conteudo = LerAquivo(*i);               /* Coloca na variável o conteúdo do arquivo atual da iteração */
            string arquivo  = ExtrairNomeDoArquivo(*i);    /* Coloca na variável somente o nome do arquivo atual da iteração */

            cout << "Nome do arquivo: " << arquivo << endl;
            cout << conteudo << endl;
    }
    cin.get(); /* Espera o usuário digitar algo*/
    return 0;  /* Termina o programa */
}
    
21.05.2015 / 22:51
4

Another way, as suggested in SOEN that I mentioned in the comments, is to use the "dirent.h" header ". It is standard on Unix and can be downloaded in Windows (and used together with your project - just have the file dirent.h header). So your code becomes more independent of the operating system.

An example usage:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

#include "dirent.h"

using namespace std;

vector<string> listfiles(char *sPath)
{
    vector<string> vRet;
    DIR *pDir = opendir(sPath);
    if(pDir != NULL)
    {
        struct dirent *pEnt;
        while((pEnt = readdir(pDir)) != NULL)
        {
            if(strcmp(pEnt->d_name, ".") != 0 && strcmp(pEnt->d_name, "..") != 0)
                vRet.push_back(pEnt->d_name);
        }
        closedir(pDir);
    }
    return vRet;
}

int main(void)
{
    vector<string> vFiles = listfiles("c:/teste/");
    char sFile[256];

    for(unsigned int i = 0; i < vFiles.size(); i++)
    {
        sprintf_s(sFile, 256, "c:/teste/%s", vFiles[i].c_str());

        ifstream oFile(sFile);
        string sData;

        getline(oFile, sData);

        printf("1a linha do arquivo {%s}: [%s]\n", sFile, sData.c_str());
    }

    return 0;
}
    
21.05.2015 / 23:09