Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

jony17

Leitura de Ficheiro

Mensagens Recomendadas

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 :(

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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);
	};
};

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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[][];
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.