Stamapare su files una lista concatenata di strutture

di Anonimizzato8604 il
20 risposte
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

  • 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?
  • Offro una birra a chi mi trova l'errore
  • 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 ...
  • Bump
  • 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.
  • No no no... acqua
  • E' un errore raffinato
    edit: Comunque quello che mi hai segnalato è un errore valido
  • 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);
    
  • È 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
  • ***** ma quanti errori hai messo . Mo non ho la testa per raggionare in modo raffinato
  • Ahahaha

    caspita volevo offrire una birra in palio ma forse devo offrirtela lo stesso per lo sforzo
  • A questo punto mi spiace pure rilevarlo
  • 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