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  
jony17

Leitura de Ficheiro

Recommended Posts

jony17

Bom dia!

Gostava que me pudessem ajudar numa duvida para o projecto da faculdade.

A minha duvida é como ler de um ficheiro e colocar tudo numa matriz.

O ficheiro tem este formato

2

[A](:D

C [D]

A 1ª linha tem o numero de linhas e colunas e as letras devem ser lidas como grupos de 3, os espaços contam.

Qual a melhor funçao para ler caracter a caracter e ir guardando ?

Como e que depois de ler a 1ª linha passo para a outra.

Espero que me possam dar umas dicas :(

Share this post


Link to post
Share on other sites
Localhost

Fazes os dois loops habituais para percorrer uma matriz e "dentro" dos dois loops lês com uma função como a getc por exemplo.

p.s. Se quiseres um exemplo, avisa.


here since 2009

Share this post


Link to post
Share on other sites
jony17

Por exemplo assim?

tam = getc (fp);
for (i=0;i<(tam*3);i++)
      for(j=0;j<(tam);j++)
            matriz[i][j] = getc(fp)

Ele passa automaticamente a ler a 2a linha depois de ler o numero?

Share this post


Link to post
Share on other sites
jony17

Eu quero é tendo o ficheiro do tipo que disse em cima, com o numero de linhas e a matriz , saber qual a melhor maneira para alterar os valores numa função.

Share this post


Link to post
Share on other sites
Miketo

Estou mais à vontade com C++ que com C, mas penso que assim dá para o que queres...

Experimenta e diz se dá  :D

FILE* fich;

fich = fopen ("matriz.txt" , "r");
if(!fich){
	printf("Erro a abrir o ficheiro\n");
	return 0;
    }
    char temp;
    int tam;
    int i,j;
    temp = getc (fich);
    tam=atoi(&temp);
    
    char tab[tam][tam*3+1];
    
    for (i=0; i<tam ; ++i){
	for (j=0; j<tam*3+1; ++j){
		tab[i][j]=getc (fich);
	};
};

Share this post


Link to post
Share on other sites
Localhost

Por exemplo assim?

tam = getc (fp);
for (i=0;i<(tam*3);i++)
      for(j=0;j<(tam);j++)
            matriz[i][j] = getc(fp)

Ele passa automaticamente a ler a 2a linha depois de ler o numero?

Então é assim.


here since 2009

Share this post


Link to post
Share on other sites
jony17

Outra duvida, se eu tenho uma função para carregar a matriz do ficheiro para uma nova matriz, neste caso para a tab[][], para depois a passar para fora dessa função e poder alterar os valores noutra passo-a no return? Tipo return tab[][];?

obrigado

Share this post


Link to post
Share on other sites
Localhost

Retornas o endereço da matriz e recebes com um ponteiro, depois é só trabalhares com ele.


here since 2009

Share this post


Link to post
Share on other sites
jony17

Por exemlo assim?

A questao dos tamanhos e que não sei muito bem como tenho que por :S

main(){
   char *tab[][[];  //tenho q definir o tamanho??
   tab [][] = carrega(FILE *fp);
}

char carrega(FILE *fp){
   char *tab[][];
   ....
   return tab[][];
}

Share this post


Link to post
Share on other sites
Miketo

Se queres que a função retorne a tabela inteira acho que

return tab;

chega....

Share this post


Link to post
Share on other sites
Localhost

Sim mas precisa de algo para receber, um ponteiro, portanto.

Isso não retorna a matriz inteira mas sim o primeiro elemento (nome = ponteiro).

Para resolver fazes algo como isto:

void func1(void) {
  int *pointer = func2;
  ...
}

int func2(void) {
  ...
  return matriz;
}


here since 2009

Share this post


Link to post
Share on other sites
Miketo

Sim, mas depois quando sai da função ele continua a poder usar a matriz e os valores que lá estão certo? A matriz que foi criada dentro da função não se apaga no fim da função?

Share this post


Link to post
Share on other sites
Localhost

@Miketo, esqueci-me de indicar uma coisa. Se a matriz for criada dentro daquela func2 que dei no exemplo tem ser criada dinamicamente para que depois possa ser utilizada noutras funções. Daí o retorno do endereço da matriz.


here since 2009

Share this post


Link to post
Share on other sites
jony17

Houve uma alteração no codigo e surgiu outra duvida:

typedef struct {
       char letra
} Tab;
Tab t[26][26]; //variavel global

void carregar (FILE *nome){

FILE *new;
int j,i;
char *str;
str= (char *)malloc(sizeof(char) * 5);
sprintf(str, "%s.ltr",nome); 
new=fopen(str, "r");

        if(!new){
               printf("Erro a abrir o ficheiro\n");
               return 0;
   	}
   	char temp;
   	int tam;

   	temp = getc (new);
   	tam=atoi(&temp);

        for (i=0; i<tam ; ++i){
              for (j=0; j<tam*3+1; ++j){
                      	t[i][j].letra=getc (new);
              }
   	}

void imprimir(){
        int i,j;
for (i=0; i<tam ; i++){
              for (j=0; j<tam*3+1; ++j){
                      printf("%c",t[i][j].letra);
              }
   	}
printf("\n");
}

O problema agora é que eu carrego a matriz para t[][] mas ao fazer os printfs na funcao imprimir não aparece nada no ecrã :S Deveria aparecer ou estou a fazer alguma coisa mal?

:)

Edit: Se eu fizer os for's com printf dentro do ciclo ele imprime no ecrã.

Outra coisa, da-me 1 warning por causa pq o getc devolve int, a alguma funcao melhor para o efeito?

Share this post


Link to post
Share on other sites
Localhost

Por esse trecho de código que deste é impossivel ver onde está o erro.


here since 2009

Share this post


Link to post
Share on other sites
Localhost

→ Não uses structs, usa um simples array bidimensional.

→ Não comeces os for's em 1 mas sim em 0.


here since 2009

Share this post


Link to post
Share on other sites
jony17

Na struct esqueci-me do outro campo :S Para ja não o uso mas mais tarde vai ser tambem para alterar o outro campo.

typedef struct {
      char cor; 
      char letra;
} Tab;

Ja adicionei o resto.

Share this post


Link to post
Share on other sites
Localhost

Não terás outra função que te está a zerar todos os elementos do array bidimensional de structs? É que pelo que vi isso de não aparecer nada é muito estranho, e depois se puseres dentro do loop que lê do ficheiro já aparece.

p.s. Mete aqui o código todo e os ficheiros para poder experimentar.


here since 2009

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.