Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [c] problema con fgets e fwrite

    buongiorno avrei un paio di problemini con questo codice:
    codice:
    #include "stdio.h"
    #include "stdlib.h"
    #include "string.h"
    
    typedef struct{
    	float peso;
    	char note[100];
    	char data[20];
    } stat;
    
    
    void main(){
    	FILE *fp;
    	stat dati;
    	printf("inserisci data-->");
    	fgets(dati.data, 20, stdin);
    	printf("inserisci peso-->");
    	scanf("%f",&dati.peso);
    	printf("note?\n");
    	fgets(dati.note, 100, stdin);
    	if(!(fp=fopen("./Registro","w+")))
    		printf("errore apertura registro.");
    	else{
    		fwrite(&dati.data, sizeof(char), 20, fp);
    		fwrite("\n", sizeof(char), 1, fp);
    		fwrite(&dati.peso, sizeof(float), 5, fp);
    		fwrite("\n", sizeof(char), 1, fp);
    		fwrite(&dati.note, sizeof(char), 100, fp);
    		fwrite("\n", sizeof(char), 1, fp);
    	}
    }
    non mi da la possibilità di inserire dati nella seconda fgets.
    Nella parte finale delle fwrite, verificando aprendo il file registro, mi scrive correttamente solo dati.data e sto cercando di capirne il perchè.
    Potreste illuminarmi con questi 2 dubbi?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326

    Re: [c] problema con fgets e fwrite

    Originariamente inviato da ballino
    non mi da la possibilità di inserire dati nella seconda fgets.
    Immediatamente prima di quella seconda fgets(), mettici

    codice:
    while (getchar() != '\n');
    solito problema del buffer di stdin che rimane sporco dopo un'istruzione di lettura da tastiera...

    Originariamente inviato da ballino
    Nella parte finale delle fwrite, verificando aprendo il file registro, mi scrive correttamente solo dati.data e sto cercando di capirne il perchè.
    Come fai a esserne sicuro visto che i dati li scrivi in binario? Nota che dati.peso è di tipo float, quindi nel momento in cui lo vai a scrivere in un file in modalità binaria stai andando a scrivere i byte che compongono quel valore, non il valore in ASCII... se lo vuoi visualizzare in ASCII devi scriverlo nel file in modalità testo, con fprintf().
    every day above ground is a good one

  3. #3
    ok, perfetto funziona. Grazie
    Però ora mi sorgono nuovi dubbi:
    da quanto ho capito la fgets salva nella variabile stringa anche '\n' di fine digitazione da tastiera, infatti questo mi si ripercuote sulla scrittura del file.
    Tornando al problema di prima, come mai il buffer di stdin rimane 'sporco'?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da ballino
    da quanto ho capito la fgets salva nella variabile stringa anche '\n' di fine digitazione da tastiera, infatti questo mi si ripercuote sulla scrittura del file.
    Se ti interessa eliminare il '\n', leggi questa discussione. C'è una funzione wrapper che puoi usare al posto della fgets(), ha la stessa signature:

    codice:
    char *mygetline(char *line, int size, FILE *file_stream)
    {
       if ( fgets(line, size, file_stream) )
       {
          char *newline = strchr(line, '\n'); /* check for trailing '\n' */
          if ( newline )
          {
             *newline =  '\0'; /* overwrite the '\n' with a terminating null */
          }
       }
       return line;
    }
    Originariamente inviato da ballino
    Tornando al problema di prima, come mai il buffer di stdin rimane 'sporco'?
    E' un ben noto e mai risolto problema, se ne è discusso tantissime volte... leggi qui ad esempio.
    every day above ground is a good one

  5. #5
    ok ora funziona tutto, ho provato anche con la getline ma ho visto che con Xcode non è presente.
    Grazie

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 © 2026 vBulletin Solutions, Inc. All rights reserved.