Leitura Sequencial de Arquivos [RESOLVIDO]

1. Leitura Sequencial de Arquivos [RESOLVIDO]

Ricardo
r_mil

(usa Ubuntu)

Enviado em 06/01/2012 - 14:26h

Olá pessoal,

Escrevi um programa em C para tratar arquivos de texto ".txt" e retornar os dados analisados em um outro arquivo ".txt". O programa está funcionando muito bem, mas o número de arquivos que preciso tratar é muito grande e, desta forma, a melhor solução que me ocorreu foi colocar os nomes desses arquivos num outro txt, chamado "lista.txt";

O problema é ler estes arquivos sequencialmente. O programa precisa efetuar a seguinte tarefa:
1. abrir o arquivo lista.txt.
2. abrir o primeiro arquivo, analisá-lo e depois fechá-lo.
3. abrir o segundo arquivo, analisá-lo e depois fechá-lo.
4. abrir o terceiro arquivo, analisá-lo e depois fechá-lo.
5. abrir o quarto ... e assim por diante, até o último.


Eu tentei duas estratégias: construir uma matriz de ponteiros e uma matriz de caracteres para guardar os nomes dos arquivos contidos em lista.txt (e depois abrir sequencialmente cada arquivo), mas não consigo acertar o código.


Alguém tem sugestões ou fragmentos de códigos?!




Desde já agradeço muito a atenção!
Forte abraço a todos.



  


2. Re: Leitura Sequencial de Arquivos [RESOLVIDO]

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 06/01/2012 - 14:36h

Essa não parece ser uma tarefa nem um pouco dificil, uma vez que se sabe como abrir, ler e fechar arquivos em C.

Segue um pseudo-algoritmo:

FILE *flista, *farquivo;

flista = abre("lista.txt")

enquanto nao terminou de ler flista; faca
nome_arquivo = [le linha atual de flista]

farquivo = abre(nome_arquivo)
[Trata o conteudo de farquivo]
fecha(farquivo)
fim enquanto

fecha(flista)


Não eh necessario carregar todo o conteudo de "lista.txt" em memoria. Leia linha por linha e trate cada arquivo em ordem.

Espero ter ajudado!


3. Re: Leitura Sequencial de Arquivos [RESOLVIDO]

Ricardo
r_mil

(usa Ubuntu)

Enviado em 09/01/2012 - 17:57h

Hebang, brigadão pela dica!
Cara, sou programador iniciante, estou tendo muita dificuldade para fazer esta pequena função.
Fiz este pequeno código com as instruções que vc me passou, mas ele não roda.
Ás vezes acusa falha de segmentação e às vezes mostra falha na abertura do arquivo.

O arquivo "lista.txt" tem 3 arquivos (um em cada linha): teste1.txt, teste2.txt e teste3. txt;
cada um deles têm um pequeno conjunto de caracteres dentro.

Alguém pode me dar um help?!




# include <stdio.h>
# include <stdlib.h>


void main () {


FILE *flista;
FILE *farquivo;

char buffer[50];
char leia;

flista = fopen ("lista.txt", "rw");

while (!feof(flista)) {
fgets(buffer, 50, flista);
printf ("\n arquivo = %s\n", buffer);
farquivo = fopen(buffer, "rw");
if (farquivo == NULL) {printf ("\nError opening file");}
while (!feof(farquivo)){
leia = getc (farquivo);
printf ("%c", leia);
}

fclose (farquivo);
}

fclose (flista);
}



4. Re: Leitura Sequencial de Arquivos [RESOLVIDO]

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 09/01/2012 - 18:30h

Opa!

Encontrei o erro: quando voce dá o "fgets", ele retorna o "\n" no final do buffer. Dai o arquivo falha ao ser aberto e, como você dava um printf sem "\n" ou fflush(stdout) ele segurava a mensagem de erro no buffer do stdout e dava segfault pq não tratava o erro.

Segue algumas correções que fiz (esse tá funcionando):


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/*
Substitui os '\n' por '[contrabarra zero]' (fim do buffer)
*/
void subs(char* buffer){
int i;
for(i = 0; i < strlen(buffer); i++){
if(buffer[i] == '\n')
buffer[i] = 0; // Contrabarra zero: fim do buffer
}
}

void main () {
FILE *flista;
FILE *farquivo;

char buffer[50];
char leia;

flista = fopen ("lista.txt", "r");

while( !feof(flista) ){
fgets(buffer, 50, flista);
subs(buffer);

printf ("Arquivo = %s\n", buffer);

farquivo = fopen(buffer, "r");
if (farquivo == NULL){
printf ("Error opening file\n");
continue;
}

printf( "Conteudo '%s':\n", buffer );
while (!feof(farquivo)){
leia = getc (farquivo);

if( leia != -1 )
printf ("%c", leia);
}

printf("\n");
fclose (farquivo);
}

fclose (flista);
}


Espero ter ajudado!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts