Struct, file e fprintf: come sostituire una fwrite con una fprintf

di il
31 risposte

Struct, file e fprintf: come sostituire una fwrite con una fprintf

Buongiorno,
ho scritto questo breve codice


#include <stdio.h>
#include <string.h>

typedef struct
{
       int giorno;
       int mese;
       int anno;
} Data;

Data DataInserimento;

void inserisciarticolo(void);

 int main ( )
{
 inserisciarticolo();
 return 0;
}

void inserisciarticolo()
{//inizio funzione
FILE *fp;
fp=fopen("testdata.txt", "w");

printf("Inserimento articolo\n\n");

if (fp==NULL) printf("Impossibile scrivere su file");
else
{
printf("Inserisci anno ");
scanf("%d", &DataInserimento.anno);
    printf("\n\nAnno %d", DataInserimento.anno);

printf("Inserisci mese ");
scanf("%d", &DataInserimento.mese);
    printf("\n\nMese %d", DataInserimento.mese);

printf("Inserisci giorno ");
scanf("%d", &DataInserimento.giorno);
    printf("\n\nGiorno %d", DataInserimento.giorno);

fwrite(&DataInserimento, sizeof(DataInserimento), 1, fp);
//fprintf(fp, "%s", &DataInserimento);

fclose(fp);
}//fine else legato alla corretta apertura file

system("PAUSE");
}

Il codice non presenta errori di sintassi. Partito il programma e inserita una data, quando apro il file generato non trovo gli interi che mi sarei aspettato ma caratteri strani;
Immagino che dipenda dalla formattazione e per questo mi piacerebbe utilizzare fprintf.

Vorrei sapere se è tutto corretto ed eventualmente come sostituire l'istruzione
 fwrite(&DataInserimento, sizeof(DataInserimento), 1, fp);
con una di tipo fprintf per poter leggere gli interi che inserisco.

Grazie.

31 Risposte

  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    Con la fwrite stai andando a scrivere la rappresentazione in byte della struttura Data, non una stringa leggibile.

    Ti consiglio una tua funzione fprintData(Data *, FILE *) dove utilizzi fprintf.

    E buon natale
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    Grazie Achille,
    ho provato con questo codice:

    fprintf(fp, "%s", &DataInserimento);

    ma non va.

    fprintData(Data *, FILE *) di cui mi scrivi non so proprio come funzioni.
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    antragorn ha scritto:


    Grazie Achille,
    ho provato con questo codice:

    fprintf(fp, "%s", &DataInserimento);

    ma non va.

    fprintData(Data *, FILE *) di cui mi scrivi non so proprio come funzioni.
    È una funzione che devi scrivere tu.

    "%s" aspetta una const char *, non un Data *. Se vuoi scrivere una struttura Data dovrai scrivere i valori che essa contiene, che fprintf può interpretare…
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    Devi usare la print come useresti la print per visualizzare i tre singoli elementi numerici
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    Basta una sola fprintf. Testo:"%02d/%02d/%02d\n"
    Numeri da prendere: data.anno, data.mese, data.giorno
    Il primo parametro é il puntatore a file, che deve essere già aperto e esistente. Io passerei direttamente per la struttura, con i puntatori si ragiona solo se indispensabile
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    silente ha scritto:


    con i puntatori si ragiona solo se indispensabile
    Non è proprio così...
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    Grazie a tutti, ma ho provato entrambe le istruzioni seguenti e non va.

    fprintf(fp, "%02d/%02d/%02d\n", DataInserimento.anno, DataInserimento.mese, DataInserimento.giorno);
    fprintf(fp, "%d%d%d", DataInserimento.anno, DataInserimento.mese, DataInserimento.giorno);

    Se qualcuno volesse scrivermi in maniera esatta l'istruzione da inserire gli sarei molto grato. Capirei così "a ritroso" la logica sottesa dell'istruzione. Grazie ancora.
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    Che vuol dire non funziona? Spiegati bene. Quella è la maniera esatta...
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    Ciao Oregon, proverò a spiegarmi. Quello che segue è il programma che con l'istruzione fwrite(&DataInserimento, sizeof(DataInserimento), 1, fp); è perfettamente funzionante. Vorrei però sostituore, se possibile, la fwrite con una fprintf.
    #include <stdio.h>
    #include <string.h>
    
    typedef struct
    {
           int giorno;
           int mese;
           int anno;
    } Data;
    
    Data DataInserimento;
    int n;
    
    void inserisciarticolo(void);
    void letturaarticolo(void);
    
     int main ( )
    {
        inserisciarticolo();
         letturaarticolo();
    
     return 0;
    //per vedere il contenuto del file creato, aprirlo con Blocco Note
    }
    
    void inserisciarticolo()
    {//inizio funzione
    FILE *fp;
    fp=fopen("testmacchinedata.txt", "w");
    
    printf("Inserimento articolo\n\n");
    
    if (fp==NULL) printf("Impossibile scrivere su file");
    else
    {//inizio else legato alla corretta apertura file
    
    printf("Inserisci anno ");
    scanf("%d", &DataInserimento.anno);
        printf("\n\nAnno %d", DataInserimento.anno);
    
    printf("Inserisci mese ");
    scanf("%d", &DataInserimento.mese);
        printf("\n\nMese %d", DataInserimento.mese);
    
    printf("Inserisci giorno ");
    scanf("%d", &DataInserimento.giorno);
        printf("\n\nGiorno %d", DataInserimento.giorno);
    
    fwrite(&DataInserimento, sizeof(DataInserimento), 1, fp);
    //fprintf(fp, "%s", DataInserimento);
    //fprintf(fp, "%02d/%02d/%02d\n", DataInserimento.anno, DataInserimento.mese, DataInserimento.giorno);
    
    
    fclose(fp);
    
    }//fine else legato alla corretta apertura file
    
    system("PAUSE");
    }//fine funzione
    
    void letturaarticolo()
    {//inizio funzione
    
    FILE *fp;
    fp=fopen("testmacchinedata.txt", "r");
    
    if (fp==NULL) printf("Impossibile leggere da file");
    else
    {//inizio else legato alla corretta apertura file
    
    
    //while(!feof(fp)){//inizio while 
    for(;;){//inizio for
    n=fread(&DataInserimento, sizeof(DataInserimento), 1, fp);
    if (n==0) break;
        printf("Anno %d\n", DataInserimento.anno);
    
        printf("Mese %d\n", DataInserimento.mese);
    
        printf("Giorno %d\n", DataInserimento.giorno);
        printf("-----------\n");
    
    
    }//fine for
    
    fclose(fp);
    
    }//fine else legato alla corretta apertura file
    
    
    }//fine funzione
    
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    E ti hanno detto come fare. Lo hai fatto?
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    Oregon, sinceramento non capisco come fare. Pensavo che ciò che mi era stato suggerito fosse l'istruzione,
    fprintf(fp, "%02d/%02d/%02d\n", DataInserimento.anno, DataInserimento.mese, DataInserimento.giorno); , ma evidentemente non è così. Non ho idea di come muovermi. In particolare pensavo di aver tradotto bene le indicazioni di silente, ma, mi ripeto, evidentemente non è così.
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    Ma dove “evidentemente”?

    Come oregon ha già chiesto, perché dici che non va?
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    _Achille ha scritto:


    Ma dove “evidentemente”?

    Come oregon ha già chiesto, perché dici che non va?
    Perché mettendo la fprint al posto di fwrite la funzione di lettura a stampa a video chiamata nel mio programma letturaarticolo(); non parte nemmeno. Ragazzi se provate voi con un compilatore facendo copia e incolla ve ne accorgete facilmente.
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    Ma la letturaarticolo deve usare la fscanf e non la fread ovviamente. Lo fai? Mostra tutto il codice di scrittura e lettura dopo averlo modificato.
Devi accedere o registrarti per scrivere nel forum
31 risposte