Stamapare su files una lista concatenata di strutture

di il
20 risposte

Stamapare su files una lista concatenata di strutture

Il mio problema è il seguente: scrivere su files una lista concatenata di strutture per salvare un database per poi in seguito poter aprire quel file, leggere le strutture, ricreare la lista concatenata e operare su di essa.
In che modalità apro il file? Quale funzione uso per scrivere i dati?
Se riuscito postate qualche codice di esempio, grazie.

20 Risposte

  • Re: Stamapare su files una lista concatenata di strutture

    Questo è un esempio, ma bada bene che c'è un errore dentro... studialo e trova l'errore
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    typedef struct node
    {
      char a;
      int  b;
      struct node *next;
    }node;
    
    node *ins_node (node **head, node *mynode)
    { 
      node *nuovo;
      if ((nuovo=malloc(sizeof(node)))==NULL)
       return NULL;
      memcpy(nuovo,mynode,sizeof(node));
      nuovo->next=*head;
      *head=nuovo;
      
      return nuovo; 
    }
    void freeall (node **head)
    { 
      node *tmp,*next;
      for (tmp=*head;tmp;tmp=next)
      {
       next=tmp->next;
       free(tmp);
      }
      *head=NULL;
    }
    void dspy (node *head)
    { 
      node *tmp;
      for (tmp=head;tmp;tmp=tmp->next)
       printf ("%c %d\n",tmp->a,tmp->b); 
    }
    void save (node *head,FILE *stream)
    { 
      node *tmp;
      fseek (stream,0L,SEEK_SET);
      for (tmp=head;tmp;tmp=tmp->next)
       fwrite (tmp,sizeof(node),1,stream);
    }
    void load (node **head,FILE *stream)
    { 
      node tmp;
      size_t n;
      fseek (stream,0L,SEEK_SET);
      while (!feof(stream))
      {
       if ((n=fread (&tmp,sizeof(node),1,stream)))
         ins_node (head, &tmp);
      }
    }
    int main ()
    {
      FILE *stream=fopen("foobar.txt","wb+");
      node *head=NULL,foo;
    
      if (!stream)
       return -1;
      
      /** example */
      foo.a='A'; foo.b=10 ; ins_node (&head, &foo);
      foo.a='B'; foo.b=20 ; ins_node (&head, &foo);
      foo.a='C'; foo.b=30 ; ins_node (&head, &foo);
    
      /** test it */
      save (head,stream); 
      freeall (&head);
      load (&head,stream);
      dspy(head);
      freeall (&head);
      
      fclose (stream);
      return 0;
    }
    
    edit: corretto dagli errori di distrazione... rimane lo stesso errore quale?
  • Re: Stamapare su files una lista concatenata di strutture

    Offro una birra a chi mi trova l'errore
  • Re: Stamapare su files una lista concatenata di strutture

    In quel codice ci sono molti errori ... prima di tutto si devono risolvere questi

    Error 3 error C4716: 'dspy' : must return a value
    Error 5 error C4716: 'load' : must return a value
    Error 4 error C4716: 'save' : must return a value

    e poi se ne parla ...
  • Re: Stamapare su files una lista concatenata di strutture

    Bump
  • Re: Stamapare su files una lista concatenata di strutture

    Non so se si può considerare errore questo:
    
    if ((n=fread (&tmp,sizeof(node),1,stream)) == 1)
    
    oppure questo:
    For the modes where both read and writing (or appending) are allowed (those which include a "+" sign), the stream should be flushed (fflush) or repositioned (fseek, fsetpos, rewind) between either a reading operation followed by a writing operation or a writing operation followed by a reading operation.
  • Re: Stamapare su files una lista concatenata di strutture

    No no no... acqua
  • Re: Stamapare su files una lista concatenata di strutture

    E' un errore raffinato
    edit: Comunque quello che mi hai segnalato è un errore valido
  • Re: Stamapare su files una lista concatenata di strutture

    Trovato:
    
    node *ins_node (node **head, node *mynode)
    {
      node *nuovo;
      if ((nuovo=malloc(sizeof(node)))==NULL)
       return NULL;
      memcpy(nuovo,mynode,sizeof(node));
      nuovo->next=*head;
      *head=nuovo;
     
      return nuovo;
    }
    
    Se malloc fallisce perdi tutta la lista se fai una cosa del genere
    
    *head = ins_node(&head,&foo);
    
  • Re: Stamapare su files una lista concatenata di strutture

    È giusto il ragionamento, la malloc non viene testata e si entra in una condizione di errore. Anche vero che il bozzetto l'ho buttato giù senza compilarlo e senza dare importanza agli errori. Solo oggi, su osservazione di oregon (che conosco e saluto) l'ho corretto.
    L'osservazione è corretta ma non è quello il punto...
    edit: comunque sempre valido anche questo errore
  • Re: Stamapare su files una lista concatenata di strutture

    ***** ma quanti errori hai messo . Mo non ho la testa per raggionare in modo raffinato
  • Re: Stamapare su files una lista concatenata di strutture

    Ahahaha

    caspita volevo offrire una birra in palio ma forse devo offrirtela lo stesso per lo sforzo
  • Re: Stamapare su files una lista concatenata di strutture

    A questo punto mi spiace pure rilevarlo
  • Re: Stamapare su files una lista concatenata di strutture

    Ok, ok la birra te la offro lo stesso

    http://en.wikipedia.org/wiki/Data_structure_alignment#Data_structure_padding
  • Re: Stamapare su files una lista concatenata di strutture

    Mi spiace ma non sono così raffinato
    Mai pensato al padding. Eppure il mio compilatore caricava bene, boh. non si finisce mai di imparare. Grazie per la birra cmq.
Devi accedere o registrarti per scrivere nel forum
20 risposte