Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    81

    [C] Scrittura e lettura FILE

    Ciao ragà!
    Devo fare un programma che mi crei un file e ci salvi dentro un array con alcuni valori..ed un programma distinto che mi apra il file di prima e leggendo i dati memorizzati nel precedente file, ci faccia delle operazioni (nel caso mio la media..)
    allora il primo prog l ho fatto così:

    codice:
    #include <stdio.h>
    
    float* Allocation_Array(int a)
    {
          int i;
          float *arr;
           
          arr = (float*) malloc(sizeof(float) * a);
    
          for(i=0; i<a; i++){
              printf("Valore vet[%d] : ",i);
              scanf("%f", &arr[i]);
          }
          return (arr);
    }
    
    main()
    {
          FILE *fp;
          float *vet;
          int ele;
          
          printf("\t\tSCRITTURA DI UN ARRAY IN UN FILE");
          printf("\n\nSpecifica la lunghezza dell'array: ");
          scanf("%d", &ele);
          printf("\n");
          
          vet = Allocation_Array(ele);
          
          fp = fopen("C:/Documents and Settings/Ale/Documenti/C/Array.dat", "w");
          
          fwrite(vet, 1, ele, fp);
          fclose(fp);
    }
    E' giusto??La compilazione va a buon fine ed eseguendolo effettivamente crea un file xo non sono come vedere se dentro abbia messo l array con i valori immessi dall'utente..
    per il secondo file stavo pensando di usare la funzione fopen con "r" stavolta xò quello che mi chiedevo io devo dichiarare di nuovo tutte le variabili o leggendo i dati nel precedente file posso direttamente fare le operazioni che voglio???
    non so se sono stato chiaro..

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Apri il file e vedi cosa c'è dentro, no?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [C] Scrittura e lettura FILE

    Originariamente inviato da InferNOS
    E' giusto??La compilazione va a buon fine ed eseguendolo effettivamente crea un file xo non sono come vedere se dentro abbia messo l array con i valori immessi dall'utente..
    per il secondo file stavo pensando di usare la funzione fopen con "r" stavolta xò quello che mi chiedevo io devo dichiarare di nuovo tutte le variabili o leggendo i dati nel precedente file posso direttamente fare le operazioni che voglio???
    non so se sono stato chiaro..
    Un po' di cose:
    1) Non hai incluso <stdlib.h>
    2) Non hai testato il valore di ritorno della malloc.
    3) Non hai testato il valore di ritorno della fopen.
    4) Non hai messo il return che ritorna il codice di stato alla fine del main.
    5) La fwrite non è corretta: se 'ele' vale 10 (dieci elementi), scrivi nel file solo 10 byte e ovviamente non è corretto. Leggiti bene la documentazione di fwrite/fread.
    6) Anche ammesso di mettere tutto a posto, ciò che scrivi nel file è tutta roba "binaria", quindi se volessi vedere cosa c'è dentro avresti bisogno di un editor esadecimale, non di un comune editor di testo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    81
    Un po' di cose:
    1) Non hai incluso <stdlib.h>
    2) Non hai testato il valore di ritorno della malloc.
    3) Non hai testato il valore di ritorno della fopen.
    4) Non hai messo il return che ritorna il codice di stato alla fine del main.
    5) La fwrite non è corretta: se 'ele' vale 10 (dieci elementi), scrivi nel file solo 10 byte e ovviamente non è corretto. Leggiti bene la documentazione di fwrite/fread.
    6) Anche ammesso di mettere tutto a posto, ciò che scrivi nel file è tutta roba "binaria", quindi se volessi vedere cosa c'è dentro avresti bisogno di un editor esadecimale, non di un comune editor di testo.
    1)Lo faccio subito..
    2/3)Si volevo prima dare un impostazione generale al prog.
    4)
    5)Non ho capito..in effetti proprio su questo avevo dei dubbi..Ogni "ele" è rappresentato da un intero (occupano 4 bytes giusto?) quindi nel write al posto di 1 devo mettere 4??
    6)immaginavo..

    cmq oltra a tutte queste belle cosettine ..il secondo prog come lo devo impostare??

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Il secondo programma, piu' o meno come il primo (con le dovute correzioni) ed usando la fread al posto della fwrite ...

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    81
    Allora il primo programma l ho corretto in questo modo..ora va meglio??

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    float* Allocation_Array(int a)
    {
          int i;
          float *arr;
           
          arr = (float*) malloc(sizeof(float) * a);
          
          if (arr == NULL)
          {
              free (arr);
              return NULL;
          }
    
          for(i=0; i<a; i++){
              printf("Valore vet[%d] : ",i);
              scanf("%f", &arr[i]);
          }
          return (arr);
    }
    
    int main()
    {
          FILE *fp;
          float *vet;
          int ele;
          
          printf("\t\tSCRITTURA DI UN ARRAY IN UN FILE");
          printf("\n\nSpecifica la lunghezza dell'array: ");
          scanf("%d", &ele);
          printf("\n");
          
          vet = Allocation_Array(ele);
          
          fp = fopen("C:/Documents and Settings/Ale/Documenti/C/Array.dat", "w");
          
          if(fp != NULL)
              fwrite(vet, sizeof(ele), ele, fp);
          else
          {
              perror("Apertura file fallita");
              exit(1);
          }
          
          fclose(fp);
          return 0;
    }
    Per il secondo programma quindi devo dichiarare nuovamente le variabili e rispecificare la lunghezza dell'array??Se si qual'è il vantaggio dei file (pensavo ke leggendo il file precendete capisse da solo quanto fosse lungo l array e coi numeri farci qualunque operazione..)

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da InferNOS
    5)Non ho capito..in effetti proprio su questo avevo dei dubbi..Ogni "ele" è rappresentato da un intero (occupano 4 bytes giusto?) quindi nel write al posto di 1 devo mettere 4??
    Una tipica documentazione di fwrite riporta:

    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

    Dove 'size' è la dimensione di 1 elemento e 'nmemb' è il numero di elementi. Il numero totale di bytes scritti (o letti per fread) è dato da: size * nmemb
    E, nota bene, il valore di ritorno di fwrite/fread è il numero di elementi scritti/letti, NON il numero totale di byte scritti/letti.

    Nel tuo caso sarebbe quindi corretto fare:

    fwrite(vet, sizeof (float), ele, fp);

    Pertanto se 'ele' vale 10 e un float è lungo 4 byte (come è tipico), allora scriverai 40 byte e se tutto ha successo, fwrite restituisce 10 (10 elementi scritti).

    Originariamente inviato da InferNOS
    per il secondo file stavo pensando di usare la funzione fopen con "r" stavolta xò quello che mi chiedevo io devo dichiarare di nuovo tutte le variabili o leggendo i dati nel precedente file posso direttamente fare le operazioni che voglio???

    il secondo prog come lo devo impostare??
    Dipende da cosa ci devi fare con i dati. Quello che è chiaro è che dovrai usare fopen con "r" per la lettura. Nota bene un'altra cosa: se stai lavorando su Windows è bene usare i modi "wb" e "rb". Il 'b' specifica una modalità binaria, in cui nessun byte è trattato in modo particolare. Questo è molto importante su Windows.

    La questione principale però è che tu non sai quanti float ci sono nel file. Potresti dedurlo dalla lunghezza del file. Quindi potresti fare una di queste cose:
    a) Determinare la lunghezza del file, calcolare il numero di float che contiene, allocare l'array e leggere tutti i float.
    b) Richiedere in input quanti elementi si vuole leggere, allocare l'array e leggere tot elementi. La funzione fread potrebbe ritornare meno elementi, se non ce ne fossero abbastanza.
    c) Leggere 1 float per volta con fread finché ce ne sono.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da InferNOS
    codice:
          arr = (float*) malloc(sizeof(float) * a);
          
          if (arr == NULL)
          {
              free (arr);
              return NULL;
          }
    Se arr è NULL, che fai la free a fare?? Ritorna subito NULL e basta.

    Originariamente inviato da InferNOS
    codice:
          fp = fopen("C:/Documents and Settings/Ale/Documenti/C/Array.dat", "w");
          
          if(fp != NULL)
              fwrite(vet, sizeof(ele), ele, fp);
          else
          {
              perror("Apertura file fallita");
              exit(1);
          }
          
          fclose(fp);
    No, innanzitutto è sbagliato il sizeof nella fwrite. Così stai prendendo la dimensione della variabile che contiene il numero di elementi!!!!

    Poi la fclose la devi fare solo se fp != NULL. Così come è, se fp è NULL (fopen fallita) facendo la fclose di NULL darebbe come risultato un bel segmentation fault .... il programma si pianta, in pratica.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    81
    OK capito!Allora il primo programma ora è apposto..per il secondo quello che dicevo io non esiste un motodo "leggi il file..letti i numeri che sono salvati dentro facci quello che ti pare"...che utilità c'è senno fare il secondo programma richiedendo all'utente quanti elementi aveva l array..non so se avete capito che intendo..

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da InferNOS
    OK capito!Allora il primo programma ora è apposto..per il secondo quello che dicevo io non esiste un motodo "leggi il file..letti i numeri che sono salvati dentro facci quello che ti pare"...che utilità c'è senno fare il secondo programma richiedendo all'utente quanti elementi aveva l array..non so se avete capito che intendo..
    Innanzitutto mi sono accorto ora che hai messo un exit(1) se la fopen fallisce. Quindi dimentica quanto ho detto prima .... se fp è NULL, la fclose non viene eseguita.

    Per quanto riguarda il secondo programma, se non vuoi chiedere in input il numero di elementi, puoi scegliere altre strade, come ho già detto anche prima. Cioè determinare quanti elementi ci sono tramite la lunghezza del file oppure leggere un float per volta.
    Se vuoi semplicemente stampare i valori uno dopo l'altro, basterebbe quest'ultima opzione.

    Volendo modificare il programma che scrive il file, potresti mettere in testa al file 4 byte (1 int) che indica quanti elementi ci sono.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.