Erro no Código [RESOLVIDO]

1. Erro no Código [RESOLVIDO]

Ricardo
r_mil

(usa Ubuntu)

Enviado em 20/09/2012 - 15:46h

Oi Pessoal,

Estou com um problema que está me dando uma tremenda dor de cabeça:
Preciso preencher com dados de arquivos uma matriz de caracteres, mas não tenho conseguido sucesso, mesmo depois de muitas tentativas.
Sou programador iniciante, não tenho muita experiência.
Estou aberto a outras abordagens para este problema, mas estou curioso para saber o que estou fazendo de errado nesta implementação para poder corrigir meu raciocínio.


Esses são os nomes dos arquivos, com seus respectivos conteúdos:

ricardo.txt
ENSG00001
ENSG00002
ENSG00003
ENSG00004
ENSG00005


ortolista.txt
ortoA.txt
ortoB.txt
ortoC.txt


ortoA.txt
ENSG00001 AAAAAAAAA
ENSG00002 AAAAAAAAA
ENSG00003 AAAAAAAAA
ENSG00004 AAAAAAAAA
ENSG00005 AAAAAAAAA


ortoB.txt
ENSG00001 BBBBBBBBB
ENSG00002 BBBBBBBBB
ENSG00003 BBBBBBBBB
ENSG00004 BBBBBBBBB
ENSG00005 BBBBBBBBB


ortoC.txt
ENSG00001 CCCCCCCCC
ENSG00002 CCCCCCCCC
ENSG00003 CCCCCCCCC
ENSG00004 CCCCCCCCC
ENSG00005 CCCCCCCCC




E este é o código:


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

int main (){

FILE * farq; // abre lista de arquivos
FILE * fref; // abre o arquivo de referencia
FILE * flis; // abre lista de arquivos a serem lidos

// Matriz de caracteres
char M[100][25];

// contadores
int i = 0;
int j = 0;
int l = 0;

// bufferes
char buffer0[100];
char buffer1[100];
char buffer2[100];

char A[30];
char B[30];

char mais[30];


// limpeza da matriz
for (i = 0; i < 100; i++){
for (l = 0; l < 25; l++){
M[i][l] = '{TEXTO}';
}
}


fref = fopen ("ricardo.txt", "r+"); // abertura do arquivo de referencias
if (fref == NULL){ printf ("\nErro ao se abrir fref!\n");}

while (fgets (buffer0, 100, fref) != NULL){ // leitura do arquivo de referencia
j++;
sscanf (buffer0, "%s", mais); // captura das palavras-chaves (alfa-numericas)
strcpy (M[j], mais); // preenchimento da matriz com as palavras capturadas acima

flis = fopen ("ortolista.txt", "rw"); // abertura da lista de arquivos a serem lidos
if (flis == NULL){printf ("\nErro ao se abrir flis!\n");}

while (fgets (buffer1, 100, flis) != NULL){ // retirando os '\n' dos nomes dos arquivos
for (i = 0; i < 100; i++){
if (buffer1[i] == '\n'){
buffer1[i] = '{TEXTO}';
}
}

farq = fopen (buffer1, "rw"); // abertura dos arquivos individuais contidos na lista
if (farq == NULL){printf ("\nErro ao se abrir farq!\n");}

while (fgets (buffer2, 100, farq) != NULL){ // leitura dos arquivos individuais
sscanf (buffer2, "%s %s", A, B); // captura das duas palavras-chaves contidas na linhas
if (strcmp (M[j], A) == 0){ // comparacao da primeira palavra-chave (alfa-numerica) com aquela da ultima linha da matriz
j++;
strcpy (M[j], B); // copia da segunda palavra-chave (apenas caracteres) do arquivo para a matriz
}
}
fclose (farq);
}
fclose (flis);
}
fclose (fref);




// -------------------------------------Impressao da Matriz-----------------------------------------//

for (i = 0; i < 100; i++){
if (M[i][0] != '{TEXTO}' && M[i][1] != '{TEXTO}' && M[i][2] != '{TEXTO}'){
printf ("MATRIZ: %s\n", M[j]);
}
}

}



Esse código executa o seguinte movimento:

1. Abre um arquivo de referência (ricardo.txt) e copia a primeira palavra-chave para a matriz M;
2. Abre uma lista com arquivos a serem pesquisados;
3. Abre o primeiro arquivo da lista e procura nele pela palavra-chave que esta em M;
4. Caso encontre, copia a outra palavra-chave da mesma linha para M;
5. Abre o segundo arquivo e de novo procura pela palavra-chave de M;
6. Caso encontre, copia a outra palavra-chave da mesma linha para M;
7. Abre o outro arquivo...
8. Copia a segunda palavra-chave do arquivo de referência para M;
9. Novamente busca por ela nos arquivos da lista... encontrando, copia as outras palavras da mesma linha para a matriz...

...

Até o encerramento da lista de palavras de ricardo.txt;


O meu objetivo é que a matriz final tenha o seguinte conteúdo:

ENSG00001
AAAAAAAAA
BBBBBBBBB
CCCCCCCCC
ENSG00002
AAAAAAAAA
BBBBBBBBB
CCCCCCCCC
ENSG00003
AAAAAAAAA
BBBBBBBBB
CCCCCCCCC
ENSG00004
AAAAAAAAA
BBBBBBBBB
CCCCCCCCC
ENSG00005
AAAAAAAAA
BBBBBBBBB
CCCCCCCCC

O problema é que sempre obtenho essa mesma resposta no terminal:
MATRIZ: AAAAAAAAA
MATRIZ: AAAAAAAAA
MATRIZ: AAAAAAAAA
MATRIZ: AAAAAAAAA
MATRIZ: AAAAAAAAA
MATRIZ: AAAAAAAAA
MATRIZ: AAAAAAAAA
MATRIZ: AAAAAAAAA
MATRIZ: AAAAAAAAA
MATRIZ: AAAAAAAAA

Eu já chequei a leitura dos arquivos, os loops, as comparações das palavras-chaves, a impressão dos dados... mas não consigo encontrar o problema.
Alguém saberia me dar uma luz para este código?


Grande abraço,


Ricardo.


  


2. Re: Erro no Código [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/09/2012 - 16:26h

Todas as chamadas a fopen() têm problemas. O modo de abertura tem de ser somente "r" ou "rt"; "rw" é terminantemente errado e "r+" não é necessário se você não pretender alterar o arquivo. Além disso, nos testes que você faz de eventual falha de abertura de cada arquivo, deveria, em caso de falha, pular a leitura de dados desse arquivo, e não apenas imprimir uma mensagem de erro.

Por que você abre flis mais de uma vez, se seus dados não mudam? Não me parece que seja necessário tratá-lo dentro do loop de leitura de fref.

A forma canônica de remover o '\n' do final de uma string retornada por fgets() é a seguinte (que é mais curta e eficiente do que a que você fez).

eol=strlen(str);
if(eol) str[eol-1]=0;


Você despreza o primeiro elemento de M, alocando espaço que não vai utilizar. Acho que fez isso não-intencionalmente mas, por isso mesmo, é bom corrigir.

Note que o loop de impressão da matriz, no final do programa, não altera o valor de j em momento algum, embora o utilize para indexar seus elementos. Logo, você realemnte imprime o mesmo valor várias vezes, porque está mandando fazer isso.


3. Re: Erro no Código [RESOLVIDO]

Ricardo
r_mil

(usa Ubuntu)

Enviado em 20/09/2012 - 21:00h

Obrigado pela ajuda Paulo!
Eu não conseguia ver o erro na função de impressão. Cara que mancada aquele 'j'!
Os outros erros eu tb já corrigi, apenas mantive a abertura da lista a cada loop: de outro jeito, sempre dava erro!


Só que o resultado ainda não está correto, sempre tenho obtido a seguinte resposta:

MATRIZ: ENSG00001
MATRIZ: AAAAAAAAA
MATRIZ: ENSG00002
MATRIZ: AAAAAAAAA
MATRIZ: ENSG00003
MATRIZ: AAAAAAAAA
MATRIZ: ENSG00004
MATRIZ: AAAAAAAAA
MATRIZ: ENSG00005
MATRIZ: AAAAAAAAA


Ele lê os outros arquivos e captura as palavras-chaves, mas não imprime!
O que pode ser isso?


4. Re: Erro no Código [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 21/09/2012 - 00:14h

Sua comparação mais interna está comparando coisas erradas.


5. Re: Erro no Código [RESOLVIDO]

Ricardo
r_mil

(usa Ubuntu)

Enviado em 21/09/2012 - 00:25h

Mas como assim Paulo?!
Qual a comparação correta?!


6. Re: Erro no Código [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 21/09/2012 - 00:53h

Você compara A com M[j], contado que este último terá a chave de procura, se der certo você acrescenta B a M e altera j. Sua próxima comparação será de A o valor anterior de B, concorda?


7. Re: Erro no Código [RESOLVIDO]

Ricardo
r_mil

(usa Ubuntu)

Enviado em 21/09/2012 - 01:07h

Paulo, muitíssimo obrigado!
Nossa, vc resolveu a questão!
Agora está rodando do jeito que eu preciso.


Parabéns pela astúcia!


Grande abraço.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts