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 3

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
Sguaraus (Normal User)
Newbie


Messaggi: 18
Iscritto: 24/01/2015

Segnala al moderatore
Postato alle 12:59
Domenica, 25/01/2015
Non vorrei sbagliarmi, ma se metto 1 dovrei leggere un elemento di grandezza sizeof(tipoelemento).
Se mettessi:

fread(&prodotto.codice, sizeof(int), 2, fp);

andrei a leggere una prima serie di bit corrispondenti alla dimensione int del codice, più un'altra serie di bit della dimensione precedente, ma che farebbero parte del campo successivo (nome) e quindi cannerei la lettura.

per lo meno, io ho capito così.

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


Messaggi: 6384
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:12
Domenica, 25/01/2015
Ovviamente la lettura sarebbe sbagliata. Ma perché non proponi il codice attuale come ti ho detto e dici cosa non va?


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


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


Messaggi: 18
Iscritto: 24/01/2015

Segnala al moderatore
Postato alle 13:19
Domenica, 25/01/2015
ora quando mando in esecuzione, inizia a leggermi tutti i campi ma li legge sbagliati e continua a farlo finchè poi windows non mi da errore.

missà che c'è un errore nelle rige 114, 115, 116.

Ultima modifica effettuata da Sguaraus il 25/01/2015 alle 13:24
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6384
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:33
Domenica, 25/01/2015
Ci sono parecchie cose che non mi sembrano corrette ... dò un'occhiata ...

Ultima modifica effettuata da nessuno il 25/01/2015 alle 13:42


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 13:42
Domenica, 25/01/2015
con magazzino=IT volevo "salvare" il primo elemento della lista nel caso in cui io debba scorrerla.

PS. ho spostato le istruzioni 114,115,116 tra la 105 e la 104. Penso che altrimenti non memorizzo mai la testa della lista.

PM Quote
Avatar
Sguaraus (Normal User)
Newbie


Messaggi: 18
Iscritto: 24/01/2015

Segnala al moderatore
Postato alle 13:46
Domenica, 25/01/2015
provando qualche modifica sono riuscito a leggere QUASI correttamente il file (devo sistemare un attimo le dimensioni di scorta e costo)

nelle fread al posto di sizeof() ho messo la lunghezza dei campi della struttura
es. nome[50]

fread(prodotto.nome, 50, 1, fp);

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


Messaggi: 18
Iscritto: 24/01/2015

Segnala al moderatore
Postato alle 18:45
Domenica, 25/01/2015
Ho cambiato un po' di cose, ora non mi da errori di compilazione tuttavia l'esecuzione mi si blocca esattamente alla prima fread del ciclo while della 2° procedura. Salta fuori "errore di lettura 1" e si blocca

Codice sorgente - presumibilmente C/C++

  1. void inserimento(FILE *fp){
  2.         TPprodotto prodotto;
  3.         TPprodmag *IT, *ITprev;
  4.         int n=0;
  5.        
  6.         //lettura da file dei nuovi prodotti
  7.         if((fp=fopen("articoliex.dat", "rb"))==NULL){
  8.                 puts(" Impossibile aprire il file");
  9.                 errore();
  10.         }
  11.         while(!feof(fp)){
  12.                 n=fread(&prodotto.codice, MAXS3, 1, fp);
  13.                 if(n!=0){
  14.                         puts(" Errore di lettura 1");
  15.                         errore();
  16.                 }
  17.                 if((IT=malloc(sizeof(TPprodmag)))==NULL){
  18.                         puts(" Impossibile allocare memoria");
  19.                         errore();
  20.                 }
  21.                 memset(IT, 0, sizeof(TPprodmag));
  22.                 IT=magazzino;
  23.                 //finchè non si trova un codice uguale o non si è arrivati
  24.                 //a fondo lista
  25.                 while(prodotto.codice!=IT->codice || IT!=NULL){
  26.                         ITprev=IT;
  27.                         IT=IT->next;
  28.                 }
  29.                 //aggiornamento prodotto
  30.                 if(IT!=NULL){
  31.                         n=fread(&prodotto.scorta, MAXS3, 1, fp);
  32.                         if(n!=0){
  33.                                 puts(" Errore di lettura 5");
  34.                                 errore();
  35.                         }
  36.                         IT->scorta=prodotto.scorta;
  37.                 }
  38.                 //nuovo prodotto
  39.                 else{
  40.                         n=fread(prodotto.nome, MAXS2, 1, fp);
  41.                         if(n!=0){
  42.                                 puts(" Errore di lettura 2");
  43.                                 errore();
  44.                         }
  45.                         n=fread(prodotto.categoria, MAXS1, 1, fp);
  46.                         if(n!=0){
  47.                                 puts(" Errore di lettura 3");
  48.                                 errore();
  49.                         }
  50.                         n=fread(prodotto.provenienza, MAXS1, 1, fp);
  51.                         if(n!=0){
  52.                                 puts(" Errore di lettura 4");
  53.                                 errore();
  54.                         }
  55.                         n=fread(&prodotto.scorta, MAXS3, 1, fp);
  56.                         if(n!=0){
  57.                                 puts(" Errore di lettura 5");
  58.                                 errore();
  59.                         }
  60.                         n=fread(&prodotto.costo, MAXS3, 1, fp);
  61.                         if(n!=0){
  62.                                 puts(" Errore di lettura 6");
  63.                                 errore();
  64.                         }
  65.                         IT->codice=prodotto.codice;
  66.                         strcpy(IT->nome, prodotto.nome);
  67.                         strcpy(IT->categoria, prodotto.categoria);
  68.                         strcpy(IT->provenienza, prodotto.provenienza);
  69.                         IT->scorta=prodotto.scorta;
  70.                         IT->costo=prodotto.costo;
  71.                         //inserimento in coda
  72.                         ITprev->next=IT;
  73.                 }
  74.         }
  75.         fclose(fp);
  76. }


Ultima modifica effettuata da Sguaraus il 25/01/2015 alle 18:46
PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo