Jump to content

Ler ficheiro Binário - C


insonias
 Share

Recommended Posts

Boas.

Eu sou novo por estas bandas e pelo o que pesquisei aqui nos tópicos não encontrei nada que me ajudasse.

O meu problema está em ler um ficheiro binário para carregar a info para memória. Ou seja, fazer um load da lista ligada a partir de um ficheiro binário.

Já tenho uma função que escreve num ficheiro a lista ligada (penso eu).


void gravarclientes(List l)
{
     FILE *f;
     f=fopen("clientes.dat","wb");
     while (l)
     {
         if(l->next!=NULL)
         {
            fwrite(l,sizeof(cliente), 1, f);
                        l=l->next;
         }
         else
         {
             l=l->next;
         }
     }
     fclose(f);
}

Agora não sei como reverter a situação, ou seja, tornar a colocar a info numa lista ligada.

Any1 help me?

Link to comment
Share on other sites

  • Replies 75
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

O problema que se levanta quando tu estás a ler de ficheiros para listas ligadas é aquele ponteiro que aponta para o próximo nó da lista.

Uma ideia é ires lendo e a cada nó que lês (tipicamente com a função fread) apontas aquele ponteiro para uma próxima leitura, ou seja, crias (dinamicamente) outra estrutura e na próxima leitura lês para o próximo nó (que já foi criado).

Só mais uma coisa, esse código, funciona? Não te dá Segmentation Fault? É que parece que estás a fazer um loop infinito e não tens condições de paragem pelo que vejo.

here since 2009

Link to comment
Share on other sites

O compilador não descarrila ... no entanto, quando abro o ficheiro o texto é o seguinte (sei que num ficheiro binário não é possível ler nada no entanto)

ÿÿÿÿX¡ CALAPPDATA=C:\Users\hp\AppData\Local LOG¡   1 ¡ ws\system32\cmd.exe ineS      X¡ X¡   2 ¡ ws\system32\cmd.exe X¡         X¡ ˜¡

será isto normal? ... uma vez que nunca vi um ficheiro deste tipo em binário

Localhost, podes dar um exemplo .. para ser sincero não domino lá muito esta matéria.

Link to comment
Share on other sites

Guest user14912

Acho que deve ser qualquer coisa assim que pretendes..


#define DIM 200

List *escreverclientes()
{
        FILE *file;
char buff[DIM];
char *c;
char *str;
List *lista=NULL;

//abrir ficheiro
file = fopen(Clientes.dat,"r");

        //verificar se abertura foi bem sucedida!
if(file == NULL)
{
	printf("erro");
	return 0;
}

      
        //ir até ao fim do ficheiro
while (!feof(file))
{
	//obter linha, envias para o char buff a string vinda do clientes.dat com tamanho DIM (200) do ficheiro
	c=fgets(buff,DIM,file);

                //aqui verificas se existem dados ainda ..
	if (c==NULL)
	{
		break;
	}

                //podia passar directamente com o c, mas vamos filtrar para verificar mesmo a string (linha-a-linha)	
                str = strtok(buff, "\n");
        
                        //verificar + 1 vez se ainda há dados
                        if (str == NULL)
	       {
		   exit(0);
                       }
        
        
        
       //enviar para a lista
       
       //se a lista estiver vazia vamos então fazer um nodo, e armazenar lá info
       if(lista==NULL) {
                       
                        //declaramos memoria para o nodo do tipo estrutura
                        lista=(List*)malloc(sizeof(List));
                        //copiamos os dados vindos do clientes.dat para o teu nodo, neste caso para um vector de caracters
                        strcpy(lista->dados,str); //dados e o teu char dados[200]; ou outro parâmetro qualquer
                        //aqui colocamos o teu apontador da lista a apontar para null, visto que não tem nenhum nodo para apontar
                        lista->next=NULL;   
               
                    
        }

        else {
     
               	  //vamos percorrer a lista até encontrar o ultimo nodo para poder inserir mais nodos ...
                   while(lista->next != NULL)lista=lista->next; 
                  // declaramos memoria para o novo nodo
                   lista->next=(List*) malloc (sizeof(List));
                  // fazemos a copia como em cima..
                   strcpy(lista->next->dados,st);
    
                   lista->next->next=NULL;
                  
         }         
        
        
  
    }

fclose(file);    
    
    
return(lista);
}


Não testei o código mas a filosofia é essa, se tiveres problemas avisa 😄

Link to comment
Share on other sites

Visto que não entendeste muito bem o exemplo que o yyajsayy deixou vou-te deixar um pequeno exemplo que te pode ajudar:

while(existem_dados) {
  if(i == 0):
    p = novo_no();
    ler(p);
  else:
    p->next = novo_no();
    ler(p->next);
  i++;
}

here since 2009

Link to comment
Share on other sites

Espero que tenham paciência porque vão precisar xD

eu vou tentar .. mas à coisas que não percebo no exemplo do yyajsayy

Já agora ... a função de escrever está bem ... uma vez que sem isso não vale a pena tentar por a leitura do ficheiro a dar  :bored:

Relembro que estou a querer ler/escrever num ficheiro em Binário !

Link to comment
Share on other sites

A ideia que tens de ter sempre em mente é que ao leres tens de ir criando nós e lendo para esses mesmo nós.

Só uma pergunta, quando queres fazes a leitura a tua lista ligada já está criada? É que se tiver é muito mais fácil.

here since 2009

Link to comment
Share on other sites

A ideia que tens de ter sempre em mente é que ao leres tens de ir criando nós e lendo para esses mesmo nós.

Só uma pergunta, quando queres fazes a leitura a tua lista ligada já está criada? É que se tiver é muito mais fácil.

hm ... podes explicar melhor a parte de "a tua lista ligada já está criada?" ?

Link to comment
Share on other sites

Antes de fazeres a leitura do ficheiro já existe em memória todas as estruturas ligadas umas às outras ou ainda tens de as criar para depois leres para elas?

Hmm .. supostamente elas são criadas antes e depois dai o load & save da informação, para que na próxima utilização do programa possa alterar/criar/eleminar nós!

?

Comentei as linhas do excerto de código acima para uma melhor compreensão da tua parte, espero que ajude 😞

sim .. isso ajuda a perceber .. no entanto tens aqui

c=fgets(buff,DIM,file);

buff? porquê DIM? só percebi o file =)

strcpy(lista->next->dados,st);
            lista->next->next=NULL;

não percebo nada disto  😄

Então tu tens de a cada leitura que fazes criar um novo nó. Já deixei há alguns posts atrás um pseudo código que te pode ajudar.

o código do yyajsayy não faz isso?

Link to comment
Share on other sites

Guest user14912

Dim é um define com o valor 200, pode-se substituir por um valor qualquer, atenção a tua string no file não pode exceder esse tamanho.

Sim, o código faz o que ele pretende é só copy paste, caso não funcione deve ser um pequeno retoque, não testei.

cumps

Link to comment
Share on other sites

Dim é um define com o valor 200, pode-se substituir por um valor qualquer.

Sim, o código faz o que ele pretende é só copy paste.

cumps

que estupidez a minha ... claro que sabia o que era o DIM .. o que eu queria perguntar é o porquê daquele parâmetro e porquê 200 ?

Além disso .. podes explicar o seguinte:

strcpy(lista->next->dados,st);
    
                   lista->next->next=NULL;

Surgiu-me outra dúvida ... o return do teu programa dá o header da lista certo? Como é que eu associo esse return ao header, uma vez que, eu tenho uma função que cria um header, que é com o qual eu faço quase tudo no programa?!

Link to comment
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
 Share

×
×
  • Create New...

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.