Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Funzione fread con dati strutturati int/char/float
Forum - C/C++ - Funzione fread con dati strutturati int/char/float - Pagina 4

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6405
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:19
Domenica, 25/01/2015
Perché scrivi

if(n!=0)

?

Semmai deve essere

if(n!=MAXS3)


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Sguaraus (Normal User)
Newbie


Messaggi: 18
Iscritto: 24/01/2015

Segnala al moderatore
Postato alle 23:26
Domenica, 25/01/2015
Perchè mi son confuso con la fopen, appena ho un attimo sistemo. Grazie :)

Ultima modifica effettuata da Sguaraus il 25/01/2015 alle 23:27
PM Quote
Avatar
Sguaraus (Normal User)
Newbie


Messaggi: 18
Iscritto: 24/01/2015

Segnala al moderatore
Postato alle 18:13
Lunedì, 26/01/2015
no al limite (n!=1) ovvero il numero di elementi che gli dico di leggere

Ultima modifica effettuata da Sguaraus il 26/01/2015 alle 19:00
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6405
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:07
Lunedì, 26/01/2015
Sì corretto ... la vista fa brutti scherzi a volte ... non vedevo l' 1 ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Sguaraus (Normal User)
Newbie


Messaggi: 18
Iscritto: 24/01/2015

Segnala al moderatore
Postato alle 22:45
Lunedì, 26/01/2015
I problemi ora sono 2.  Provo a ripostare il programma ora che l'ho snellito un po'.


Ultima modifica effettuata da Sguaraus il 26/01/2015 alle 22:49
PM Quote
Avatar
Sguaraus (Normal User)
Newbie


Messaggi: 18
Iscritto: 24/01/2015

Segnala al moderatore
Postato alle 22:55
Lunedì, 26/01/2015
Problema 1: riga 65

quando sono nel ciclo while e leggo e stampo i prodotti. Non so perché ma all'ultima esecuzione del ciclo il programma legge l'ultimo prodotto, dopodiché, invece che uscire dal ciclo, legge ancora una volta ma il puntatore è a fine file quindi legge sbagliato. Non contento, legge poi ancora una volta l'ultimo prodotto dopodiché lo stampa (non posso usare dei contatori per sapere quanti elementi fargli leggere).

Io avevo pensato di "sfruttare" il fatto che legge sbagliato assegnando ad n il valore di ritorno della fread per poi usare n come condizione del ciclo while. Così facendo però mi legge solo il primo elemento, poi passa alla funzione dopo. Mi è venuto il dubbio che forse la fread non restituisce esattamente il numero di elementi letti e che quindi è sempre diversa da 1 tranne alla prima esecuzione. Possibile??

Problema 2: riga 100

quando inizia a ciclare la funzione inserimento windows crasha.

Non ho proprio idea del perché.

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stddef.h>
  4. #include <stdlib.h>
  5.  
  6. #define MAXS1 30
  7. #define MAXS2 50
  8.  
  9. typedef struct {
  10.                 int codice;
  11.                 char nome[MAXS2];
  12.                 char categoria[MAXS1];
  13.                 char provenienza[MAXS1];
  14.                 int scorta;
  15.                 float costo;
  16.         } TPprodotto;
  17.  
  18. typedef struct TPprodtemp{
  19.                 int codice;
  20.                 char nome[MAXS2];
  21.                 char categoria[MAXS1];
  22.                 char provenienza[MAXS1];
  23.                 int scorta;
  24.                 float costo;
  25.                 struct TPprodtemp *next;
  26.         } TPprodmag;
  27.  
  28. FILE *fp;
  29. TPprodmag *magazzino, *IT, *ITprev;
  30.  
  31. void lettura(FILE *fp);
  32. void inserimento(FILE *fp);
  33. void stampa(TPprodmag *magazzino);
  34. void eliminazione(FILE *fp);
  35. void memorizzazione(FILE *fp);
  36. void errore();
  37. void libera_memoria(TPprodmag *magazzino);
  38.  
  39. int main(int argc, char *argv[]){
  40.        
  41.         lettura(fp);
  42.         puts("fun 1");
  43.         inserimento(fp);
  44.         puts("fun 2");
  45.         stampa(magazzino);
  46.         puts("fun 3");
  47.         eliminazione(fp);
  48.         puts("fun 4");
  49.         stampa(magazzino);
  50.         puts("fun 5");
  51.         memorizzazione(fp);
  52.         puts("fun 6");
  53.         errore();
  54.         puts("fun 7");
  55. }
  56.  
  57. void lettura(FILE *fp){
  58.         TPprodotto prodotto;
  59.         int n=1;
  60.        
  61.         if((fp=fopen("magazzino.dat", "rb+"))==NULL){
  62.                 puts(" Impossibile aprire il file");
  63.                 errore();
  64.         }
  65.         while(n==1){
  66.                 //allocazione della memoria per ogni prodotto
  67.                 if((IT=malloc(sizeof(TPprodmag)))==NULL){
  68.                         puts(" Impossibile allocare memoria");
  69.                         errore();
  70.                 }
  71.                 memset(IT, 0, sizeof(TPprodmag));
  72.                 //lettura dei prodotti dal file
  73.                 n=fread(&prodotto, sizeof(TPprodotto), 1,fp);
  74.                 //stampa dei prodotti caricati
  75.                 printf(" Codice:\t\t\t%d\n", prodotto.codice);
  76.                 printf(" Nome:\t\t\t\t%s\n", prodotto.nome);
  77.                 printf(" Categoria:\t\t\t%s\n", prodotto.categoria);
  78.                 printf(" Provenienza:\t\t\t%s\n", prodotto.provenienza);
  79.                 printf(" Scorta:\t\t\t%d\n", prodotto.scorta);
  80.                 printf(" Costo:\t\t\t\t%.2f\n\n", prodotto.costo);
  81.                 //se IT è a NULL non ho elementi nella lista quindi
  82.                 //lo prendo come testa(*magazzino) della lista
  83.                 if(IT==NULL){
  84.                         magazzino=IT;
  85.                 }
  86.                 //copia dei prodotti nella struttura dinamica
  87.                 IT->codice=prodotto.codice;
  88.                 strcpy(IT->nome, prodotto.nome);
  89.                 strcpy(IT->categoria, prodotto.categoria);
  90.                 strcpy(IT->provenienza, prodotto.provenienza);
  91.                 IT->scorta=prodotto.scorta;
  92.                 IT->costo=prodotto.costo;
  93.                 //inserimento in coda
  94.                 ITprev->next=IT;
  95.                 ITprev=IT;
  96.         }
  97.         fclose(fp);
  98. }
  99.  
  100. void inserimento(FILE *fp){
  101.         TPprodotto prodotto;
  102.         int n=1;
  103.        
  104.         memset(IT, 0, sizeof(TPprodmag));
  105.         memset(ITprev, 0, sizeof(TPprodmag));
  106.         //lettura da file dei nuovi prodotti
  107.         if((fp=fopen("articoliex.dat", "rb"))==NULL){
  108.                 puts(" Impossibile aprire il file");
  109.                 errore();
  110.         }
  111.         while(n==1){
  112.                 n=fread(&prodotto.codice, sizeof(int), 1, fp);
  113.                 if(n!=1){
  114.                         puts(" Errore di lettura 1");
  115.                         errore();
  116.                 }
  117.                 IT=magazzino;
  118.                 //finchè non si trova un codice uguale o non si è arrivati
  119.                 //a fondo lista
  120.                 while(prodotto.codice!=IT->codice || IT!=NULL){
  121.                         ITprev=IT;
  122.                         IT=IT->next;
  123.                 }
  124.                 //aggiornamento prodotto
  125.                 if(IT!=NULL){
  126.                         n=fread(&prodotto.scorta, sizeof(int), 1, fp);
  127.                         if(n!=1){
  128.                                 puts(" Errore di lettura 5");
  129.                                 errore();
  130.                         }
  131.                         IT->scorta=prodotto.scorta;
  132.                 }
  133.                 //nuovo prodotto
  134.                 else{
  135.                         n=fread(&prodotto, sizeof(TPprodotto), 1, fp);
  136.                        
  137.                         IT->codice=prodotto.codice;
  138.                         strcpy(IT->nome, prodotto.nome);
  139.                         strcpy(IT->categoria, prodotto.categoria);
  140.                         strcpy(IT->provenienza, prodotto.provenienza);
  141.                         IT->scorta=prodotto.scorta;
  142.                         IT->costo=prodotto.costo;
  143.                         //inserimento in coda
  144.                         ITprev->next=IT;
  145.                 }
  146.         }
  147.         fclose(fp);
  148. }
  149.  
  150. void stampa(TPprodmag *magazzino){
  151.        
  152.         memset(IT, 0, sizeof(TPprodmag));
  153.         memset(ITprev, 0, sizeof(TPprodmag));
  154.         //stampa dei prodotti a magazzino
  155.         IT=magazzino;
  156.         while(IT!=NULL){
  157.                 printf(" Codice:\t\t\t%d\n", IT->codice);
  158.                 printf(" Nome:\t\t\t%s\n", IT->nome);
  159.                 printf(" Categoria:\t\t\t%s\n", IT->categoria);
  160.                 printf(" Provenienza:\t\t\t%s\n", IT->provenienza);
  161.                 printf(" Scorta:\t\t\t%d\n", IT->scorta);
  162.                 printf(" Costo:\t\t\t%.2f\n", IT->costo);
  163.                 printf("\n\n");
  164.                 ITprev=IT;
  165.                 IT=IT->next;
  166.         }
  167. }
  168.  
  169. void eliminazione(FILE *fp){
  170.        
  171.         memset(IT, 0, sizeof(TPprodmag));
  172.         memset(ITprev, 0, sizeof(TPprodmag));
  173.         if((fp=fopen("magazzino.dat", "rb+"))==NULL){
  174.                 puts(" Impossibile aprire il file");
  175.                 errore();
  176.         }
  177.         IT=magazzino;
  178.         while(IT!=NULL || IT->codice!=985){
  179.                 ITprev=IT;
  180.                 IT=IT->next;
  181.         }
  182.         ITprev->next=IT->next;
  183.         free(IT);
  184.        
  185.         IT=magazzino;
  186.         while(IT!=NULL || IT->codice!=1015){
  187.                 ITprev=IT;
  188.                 IT=IT->next;
  189.         }
  190.         ITprev->next=IT->next;
  191.         free(IT);
  192.        
  193.         IT=magazzino;
  194.         while(IT!=NULL || IT->codice!=1150){
  195.                 ITprev=IT;
  196.                 IT=IT->next;
  197.         }
  198.         ITprev->next=IT->next;
  199.         free(IT);
  200.         fclose(fp);
  201. }
  202.  
  203. void memorizzazione(FILE *fp){
  204.         TPprodotto prodotto;
  205.         int n=1;
  206.        
  207.         memset(IT, 0, sizeof(TPprodmag));
  208.         if((fp=fopen("magazzino_aggiornato.dat", "wb"))==NULL){
  209.                 puts(" Impossibile allocare memoria");
  210.                 errore();
  211.         }
  212.         IT=magazzino;
  213.         while(n!=0){
  214.                 prodotto.codice=IT->codice;
  215.                 n=fwrite(&prodotto.codice, sizeof(int), 1, fp);
  216.                 if(n!=1){
  217.                         puts(" Errore di scrittura 1");
  218.                         errore();
  219.                 }
  220.                 strcpy(prodotto.nome, IT->nome);
  221.                 n=fwrite(prodotto.nome, sizeof(char)*MAXS2, 1, fp);
  222.                 if(n!=1){
  223.                         puts(" Errore di scrittura 2");
  224.                         errore();
  225.                 }
  226.                 strcpy(prodotto.categoria, IT->categoria);
  227.                 n=fwrite(prodotto.categoria, sizeof(char)*MAXS1, 1, fp);
  228.                 if(n!=1){
  229.                         puts(" Errore di scrittura 3");
  230.                         errore();
  231.                 }
  232.                 strcpy(prodotto.provenienza, IT->provenienza);
  233.                 n=fwrite(prodotto.provenienza, sizeof(char)*MAXS1, 1, fp);
  234.                 if(n!=1){
  235.                         puts(" Errore di scrittura 4");
  236.                         errore();
  237.                 }
  238.                 prodotto.scorta=IT->scorta;
  239.                 n=fwrite(&prodotto.scorta, sizeof(int), 1, fp);
  240.                 if(n!=1){
  241.                         puts(" Errore di scrittura 5");
  242.                         errore();
  243.                 }
  244.                 prodotto.costo=IT->costo;
  245.                 n=fwrite(&prodotto.costo, sizeof(float), 1, fp);
  246.                 if(n!=1){
  247.                         puts(" Errore di scrittura 6");
  248.                         errore();
  249.                 }
  250.                 IT=IT->next;
  251.         }
  252.         fclose(fp);
  253. }
  254.  
  255. void libera_memoria(TPprodmag *magazzino){
  256.        
  257.         memset(IT, 0, sizeof(TPprodmag));
  258.         memset(ITprev, 0, sizeof(TPprodmag));
  259.         IT=magazzino;
  260.         while(IT!=NULL){
  261.                 ITprev=IT;
  262.                 IT=IT->next;
  263.                 free(ITprev);
  264.         }
  265. }
  266.  
  267. void errore(){
  268.         puts("ERROR 1");
  269.         libera_memoria(magazzino);
  270.         puts("ERROR 2");
  271.         fclose(fp);
  272.         puts("ERROR 3");
  273.         exit;
  274. }


Ultima modifica effettuata da Sguaraus il 26/01/2015 alle 23:30
PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo