• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

claudioribeiro

Ajuda com leitura e escrita de matrizes para ficheiro

6 mensagens neste tópico

Boa tarde.

necessito de uma pequena ajuda. Eu tenho o seguinte código em C.

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

#define DIM 15
#define DIM2 13


main(){

FILE *fp;

char mat[DIM][DIM2];

int l,c;
int num;
int i,j;


if((fp=fopen("DADOS.TXT","a+"))==NULL){
	printf("Impossivel abrir o ficheiro.");
	exit(1);
}

for (l=0;l<DIM;l++){ 
	for (c=0;c<DIM2;c++){
		fscanf(fp,"%c",&num);
		mat[l][c]=num;
		printf("%c",mat[l][c]);
	}
}
fclose(fp);	

printf("\n%c",mat[9][9]);
getchar();
if(mat[9][9]=='1')
	mat[9][9]='X';


for (l=0;l<DIM;l++){ 
	for (c=0;c<DIM2;c++){
		printf("%c",mat[l][c]);
	}
}
getchar();


}

Isto pretende ler um ficheiro que tem uma matriz quadrada com números. O que estou a tentar fazer é que ao inserir um qualquer indice, o valor que la estiver é substituido por um X.

Para ver o que estava a acontecer fiz o seguinte:

printf("\n%c",mat[9][9]);

getchar();

if(mat[9][9]=='1')

mat[9][9]='X';

no printf ele acede correctamente ao indice e mostra que está lá o valor 1.

depois faço a substituição e ele realmente marca o X na linha correcta mas o valor da coluna é ignorado, ficando sempre na primeira coluna.

Alguém me pode ajudar a ver onde estou errado? Eu sei que é provavelmente muito básico o erro mas já me fartei de procurar e não consigo ver o erro.

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qual é o conteúdo do ficheiro "DADOS.TXT" (incluindo espaços em branco e mudanças de linha)?

Os "ENTERs" que estão no ficheiro vão todos para mat[??][12]? Ou será que vai algum para mat[9][8] e, quando imprimes o valor de mat[9][9] parece-te que este está na primeira coluna (efectivamente, se não me enganei, está na primeira coluna do ecrã ... mas na décima coluna da matriz).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O conteudo é este. Está em CHAR.

    222  222 

    222  222 

    222  222 

  2222 2222 

  2222 2222 

222222 222222

222222 222222

Isso dos ENTER's como posso saber? A escrita foi feita com fprintf's.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se é esse como é que vai parar um '1' ao mat[9][9]? :thumbsup:

No ciclo em que lês a matriz experimenta imprimir também os indices e o valor em decimal:

   for (l=0;l<DIM;l++){
      for (c=0;c<DIM2;c++){
         fscanf(fp,"%c",&num);
         mat[l][c]=num;
         printf("mat[%d][%d] == %d (caracter: %c)\n", l, c, mat[l][c], mat[l][c]);
      }
   }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa, só colou a parte de cima. Em baixo tem uma cadeia exactamente igual mas com 1.

Fiz o que disseste e devolve-me os indices todos correctos. Ou melhor, quase correctos. Porque qdo muda de linha, o Enter fica realmente metido no primeiro indice da nova linha.

Alguma dica de como evitar que isso aconteça? Ou então o que pesquisar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que eu acho melhor é ler o ficheiro linha a linha, em vez de caracter a caracter.

Depois de leres uma linha, passas essa linha para a respectiva linha da matriz, tendo em atenção os ENTERs, os caracteres a mais ou a menos.

   for (l=0;l<DIM;l++){
      char buf[DIM2]; /* declara array temporario */
      /* ler linha */
      if (fgets(buf, sizeof buf, fp) == NULL) {
         /* erro na leitura do ficheiro */
      }
      /* passar caracteres para array */
      /* do principio ate ao ENTER (ou ate encher) */
      c=0;
      while (c < DIM2 && buf[c] != '\n') {
         mat[l][c]=buf[c];
         printf("mat[%d][%d] == %d (caracter: %c)\n", l, c, mat[l][c], mat[l][c]);
         c++;
      }
      /* preencher o resto (se houver) com espacos */
      while (c < DIM2) {
         mat[l][c]=' ';
         printf("mat[%d][%d] == %d (caracter: %c)\n", l, c, mat[l][c], mat[l][c]);
         c++;
      }
   }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora