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

Sign in to follow this  
claudioribeiro

Ajuda com leitura e escrita de matrizes para ficheiro

Recommended Posts

claudioribeiro

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

Share this post


Link to post
Share on other sites
pmg

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


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
claudioribeiro

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.

Share this post


Link to post
Share on other sites
pmg

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


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
claudioribeiro

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?

Share this post


Link to post
Share on other sites
pmg

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


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.