Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - problema con fread()
Forum - C/C++ - problema con fread()

Avatar
Bonny (Member)
Expert


Messaggi: 435
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 15:26
Martedì, 24/08/2010
Salve a tutti sto cercando di fare esercizi sulle liste e lettura/scrittura su file binari,
la struttura del nodo comprende due campi un intero ed un array di caratteri, ho implementato delle funzioni per creare la lista, stampare il contenuto della lista(a video e su file), nel file scrivo l'intero nodo con la funz fwrite() fatto questo vorrei leggere i dati dal file e creare una nuova lista.
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. // struttura del nodo
  5. typedef struct elemento {
  6.                              int value;
  7.                              char nome[10];
  8.                              struct elemento *next;
  9.                           } nodo;
  10. typedef nodo *list;
  11. // var globale di tipo list
  12. list root = NULL;
  13. // prototipi
  14. void stampa();
  15. void stampanewlista();
  16. void leggi();
  17. void scrivi(list);
  18. list cons(int,char [],list);
  19. // main principale  
  20.                  
  21. main() {
  22.                
  23.                  
  24.  leggi();
  25.  stampa();//stampa dati appena letti
  26.            
  27.  stampanewlista();//dovrebbe creare una nuova lista con tutti i dati
  28.                   //salvati nel file e stamparli  video
  29.  
  30. system("PAUSE");
  31. }
  32.  
  33. void scrivi(list x){
  34.      
  35.      FILE *fp;
  36.      
  37.      if((fp = fopen("dati.dat","ab")) == NULL){
  38.             printf("Errore durante l'apertura del file...");
  39.             }else{
  40.                   fwrite(&x,sizeof(nodo),1,fp);
  41.                   printf("\n\tDato salvato con successo\n");
  42.                   fclose(fp);
  43.                   }
  44.      }
  45.  
  46. list cons(int e, char s[],list l) {
  47.      
  48.                             list t;
  49.                             t = (list)malloc(sizeof(nodo));
  50.                             t->value = e;
  51.                             strcpy(t->nome,s);
  52.                             scrivi(l);//scrivo il nodo sul file
  53.                             t->next = l;
  54.                            
  55.                             return t;
  56. }
  57. void leggi(){
  58.      
  59.   int n;
  60.   char c[10];
  61.  
  62.     do {
  63.         printf("\nIntrodurre numero: \t");
  64.         scanf("%d", &n);
  65.           printf("\nIntrodurre nome: \t");
  66.           scanf("%s", c);
  67.         root = cons(n,c,root);
  68.        
  69.     } while (n!=0);  
  70. }
  71.  
  72. void stampa(){
  73.          
  74. while(root!=NULL){
  75.                   printf("%d %s\n",root->value,root->nome);
  76.                   root=root->next;
  77.                   }
  78. }
  79.  
  80. list cons2(list e,list my){
  81.      
  82.                            
  83.                             e = (list)malloc(sizeof(nodo));
  84.  
  85.                             e->next = my;
  86.                            
  87.                             return e;
  88.      }
  89. void stampanewlista(){
  90.      
  91.      list newlista = NULL, x = NULL;
  92.      FILE *fp;
  93.      
  94.           if((fp = fopen("dati.dat","rb")) == NULL){
  95.             printf("Errore durante l'apertura del file...");
  96.             }else{
  97.                   while(!feof(fp)){
  98.                                  
  99.                      fread(&x,sizeof(nodo),1,fp);
  100.                      newlista = cons2(x,newlista);
  101.                     }
  102.                   }
  103.           while(newlista!=NULL){
  104.                   printf("%d %s\n",newlista->value,newlista->nome);
  105.                   newlista=newlista->next;
  106.                   }
  107.      }


Il programma viene compilato perfettamente, ma stampa solo 3 record e con caratteri strani
Il prob è sicuramente nella creazione della nuova lista ma nn riesco a risolverlo.
il codice non è dei migliori scusate.


Ultima modifica effettuata da Bonny il 24/08/2010 alle 15:28


Bonny
PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 435
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 17:27
Martedì, 24/08/2010
Problema risolto!! Se a qualcuno di voi interessa questo argomento vi lascio il codice:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. // struttura del nodo
  5. typedef struct dato{
  6.        
  7.                       int n;
  8.                       char nome[10];
  9.                  }element_type;
  10.                  
  11. typedef struct elemento {
  12.                              element_type value;
  13.                              struct elemento *next;
  14.                           } nodo;
  15.                                                  
  16. typedef nodo *list;
  17. // var globale di tipo list
  18. list root = NULL;
  19. // prototipi
  20. void stampalista(list);
  21. void stampanewlista();
  22. void leggi();
  23. void scrivi(element_type);
  24. list cons(element_type,list);
  25. list consfile(FILE *);
  26. // main principale  
  27.                  
  28. main() {
  29.    
  30.    list L = NULL;            
  31.                  
  32.  leggi();
  33.  stampalista(root);            
  34.  
  35.  
  36.       FILE *fpx;
  37.      
  38.      if((fpx = fopen("dati.dat","rb")) == NULL){
  39.             printf("Errore durante l'apertura del file...");
  40.             }else{
  41.                   L = consfile(fpx);
  42.                   close(fpx);
  43.                   stampalista(L);
  44.                   }
  45.      
  46.              
  47. system("PAUSE");
  48. }
  49.  
  50. void scrivi(element_type x){
  51.      
  52.      FILE *fp;
  53.      
  54.      if((fp = fopen("dati.dat","ab")) == NULL){
  55.             printf("Errore durante l'apertura del file...");
  56.             }else{
  57.                   fwrite(&x,sizeof(element_type),1,fp);
  58.                   printf("\n\tDato salvato con successo\n");
  59.                   close(fp);
  60.                   }
  61.      }
  62.  
  63. list cons(element_type EL, list l) {
  64.                                  
  65.                             list t;                            
  66.                             t = (list)malloc(sizeof(nodo));                          
  67.                             t->value.n = EL.n;                            
  68.                             strcpy(t->value.nome,EL.nome);                            
  69.                             scrivi(EL);//scrivo il nodo sul file                          
  70.                             t->next = l;
  71.                            
  72.                             return t;
  73. }
  74. void leggi(){
  75.  
  76.    int scelta;    
  77.    element_type x;
  78.  
  79.    while(scelta != 0){
  80.                
  81.            printf("\nIntrodurre numero: \t");
  82.            scanf("%d", &x.n);
  83.             printf("\nIntrodurre nome: \t");
  84.             scanf("%s", x.nome);
  85.            
  86.              root = cons(x, root);
  87.              
  88.           system("CLS");
  89.           printf("\t* PREMERE 1 PER CONTINUARE\n\n\t* PREMERE 0 PER USCIRE\n");
  90.           scanf("%d",&scelta);
  91.           system("CLS");
  92.       }    
  93. }
  94.  
  95. void stampalista(list r){
  96.          
  97.                 while(r != NULL){
  98.                    printf("%d %s\n", r->value.n, r->value.nome);
  99.                    r = r->next;
  100.                   }
  101. }
  102.  
  103. list consfile(FILE *f){
  104.      
  105.        list newroot = NULL, temp = NULL;
  106.         element_type T;
  107.  
  108.        fread(&T, sizeof(element_type), 1, f);
  109.        
  110.        while(!feof(f)){
  111.                
  112.                temp = (list)malloc(sizeof(nodo));
  113.                temp->value.n = T.n;
  114.                strcpy(temp->value.nome,T.nome);
  115.                temp->next = newroot;
  116.                newroot = temp;
  117.                fread(&T, sizeof(element_type), 1, f);
  118.                
  119.                }
  120.        return newroot;      
  121.      }


Ultima modifica effettuata da Bonny il 24/08/2010 alle 17:30


Bonny
PM Quote