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

di il
31 risposte

31 Risposte - Pagina 2

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

    Quindi mi pare di capire che fprintf(fp, "%02d/%02d/%02d\n", DataInserimento.anno, DataInserimento.mese, DataInserimento.giorno); vada bene a patto che in letturaarticolo non si utilizzi fread ma fscanf. Ci provo e poi posto tutto e vi faccio sapere.
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    Funziona perfettamente. Posto il codice e poi scrivo un post successivo per un chiarimento.
    
    #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();
    
    system("PAUSE");
     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
    
    
    }//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 while
    n=fscanf (fp,"%d%d%d", &DataInserimento.anno, &DataInserimento.mese, &DataInserimento.giorno);
    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 while
    
    fclose(fp);
    
    }//fine else legato alla corretta apertura file
    
    
    }//fine funzione
    
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    Quindi in caso di lettura e scrittura sono vincolato ad utilizzare in coppia o fprinf e fscanf oppure fwirite e fread? Giusto? Posso avere link (in italiano) o manuali seri per capirci qualcosa in più?

    Attualmente, tra gli altri, uso il Deitel (che mi è andato bene fino ai puntatori, poi mi sono "perso") e "Linguaggio C" di Alessandro Bellini e Andrea Guidi che mi sembra un bel testo.
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    Se usi file di testo e leggi/scrivi dati in Ascii allora usi fscanf/fprintf

    Se usi file binari allora usi fread/ferite

    C'è in qualsiasi libro sul linguaggio C
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    oregon ha scritto:


    Se usi file di testo e leggi/scrivi dati in Ascii allora usi fscanf/fprintf

    Se usi file binari allora usi fread/ferite

    C'è in qualsiasi libro sul linguaggio C
    Non ho mai letto niente di tutto questo. E cmq mi sembra che le coppie siano intercambiabili. Qui ho usato un file .txt e funzionano entrambe le coppie.

    Cmq in definitiva ancora grazie.

    p.s. Da oggi in poi proverò a essere un membro attivo della comunità.
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    antragorn ha scritto:


    oregon ha scritto:


    Se usi file di testo e leggi/scrivi dati in Ascii allora usi fscanf/fprintf

    Se usi file binari allora usi fread/ferite

    C'è in qualsiasi libro sul linguaggio C
    Non ho mai letto niente di tutto questo. E cmq mi sembra che le coppie siano intercambiabili. Qui ho usato un file .txt e funzionano entrambe le coppie.

    Cmq in definitiva ancora grazie.

    p.s. Da oggi in poi proverò a essere un membro attivo della comunità.
    Non sono assolutamente intercambiabili. fwrite scrive blocchi di byte (e può serializzare una struttura), che non sono caratteri ASCII mentre fprintf scrive testo formattato, ovvero sequenze di caratteri ASCII.
    Hanno scopi diversi.
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    _Achille ha scritto:


    antragorn ha scritto:


    oregon ha scritto:


    Se usi file di testo e leggi/scrivi dati in Ascii allora usi fscanf/fprintf

    Se usi file binari allora usi fread/ferite

    C'è in qualsiasi libro sul linguaggio C
    Non ho mai letto niente di tutto questo. E cmq mi sembra che le coppie siano intercambiabili. Qui ho usato un file .txt e funzionano entrambe le coppie.

    Cmq in definitiva ancora grazie.

    p.s. Da oggi in poi proverò a essere un membro attivo della comunità.
    Non sono assolutamente intercambiabili. fwrite scrive blocchi di byte (e può serializzare una struttura), che non sono caratteri ASCII mentre fprintf scrive testo formattato, ovvero sequenze di caratteri ASCII.
    Hanno scopi diversi.
    Ok. Proverò ad approfondire cercando sui testi a mia disposizione ed eventualmente comprandone altri. A questo punto farò un po' di test ma a naso mi sembra che su un file .txt sarebbe meglio utilizzare fprintf . Se dovessi trovare un po' di materiale, condividerò qui il riferimento bibliografico. Ancora grazie.
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    No, non è che “sarebbe meglio”. Io credo che tu riesca a leggere caratteri, non byte. Correggimi se sbaglio.

    Ad esempio:
    1617205 (int, 4 byte).
    Come lo scrive fprintf: "1617205"
    Come lo scrive fwrite: 00000000000110001010110100110101
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    _Achille ha scritto:


    No, non è che “sarebbe meglio”. Io credo che tu riesca a leggere caratteri, non byte. Correggimi se sbaglio.
    Sì, leggo caratteri.
    Per la precisione, leggo questo:
    1000/12/31

    E' correttissimo perché sono anno mese e giorno che ho inserito.
    Mi colpisce il carattere / che non ho inserito io!!! Forse l'implementazione prevede quel carattere dopo ogni intero. Non so che dire.
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    Con fwrite e fread leggo dei caratteri strani.

    Esattamente come avevi detto.
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    antragorn ha scritto:


    _Achille ha scritto:


    No, non è che “sarebbe meglio”. Io credo che tu riesca a leggere caratteri, non byte. Correggimi se sbaglio.
    Sì, leggo caratteri.
    Per la precisione, leggo questo:
    1000/12/31

    E' correttissimo perché sono anno mese e giorno che ho inserito.
    Mi colpisce il carattere / che non ho inserito io!!! Forse l'implementazione prevede quel carattere dopo ogni intero. Non so che dire.
    Li hai scritti tu gli slash
    
    fprintf(fp, "%02d/%02d/%02d\n", DataInserimento.anno, DataInserimento.mese, DataInserimento.giorno);
    
    fprintf(fp, "%02d/%02d/%02d\n", DataInserimento.anno, DataInserimento.mese, DataInserimento.giorno);
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    Weierstrass ha scritto:


    antragorn ha scritto:


    _Achille ha scritto:


    No, non è che “sarebbe meglio”. Io credo che tu riesca a leggere caratteri, non byte. Correggimi se sbaglio.
    Sì, leggo caratteri.
    Per la precisione, leggo questo:
    1000/12/31

    E' correttissimo perché sono anno mese e giorno che ho inserito.
    Mi colpisce il carattere / che non ho inserito io!!! Forse l'implementazione prevede quel carattere dopo ogni intero. Non so che dire.
    Li hai scritti tu gli slash
    
    fprintf(fp, "%02d/%02d/%02d\n", DataInserimento.anno, DataInserimento.mese, DataInserimento.giorno);
    
    fprintf(fp, "%02d/%02d/%02d\n", DataInserimento.anno, DataInserimento.mese, DataInserimento.giorno);
    Giusto!!!
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    @antragorn ... hai molta confusione e dai molte cose (sbagliate) per conosciute e certe. Ad esempio pensi che l'estensione di un file sia determinante per il suo contenuto. Devi studiare le basi del linguaggio e ti consiglio di approfondire sui libri. La gestione dei file è un argomento basilare e direi che non c'è molto da scoprire....
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    "dai molte cose (sbagliate) per conosciute e certe". Tipo? Se in questo frangente sono emersi altri errori (di cui non mi accorgo nemmeno!!!) mi piacerebbe conoscerli per corregerli.

    Per esempio non penso "che l'estensione di un file sia determinante per il suo contenuto" per il semplice fatto che non mi sono mai occupato/interessato dell'estensione dei file (di cui so poco e niente) e avrei preso quanto detto qui per smanettare un po'. Sui file .txt, volevo solo dire che forse, e ribadisco forse, è meglio scriverci in printf perché uno quando apre un file .txt con notepad si aspetta qualcosa di intellegibile. Magari non è così: non ho esperienza.

    Ma ripeto, se in questo frangente sono emersi altri errori (di cui, cosa grave, non mi accorgo) mi piacerebbe conoscerli per corregerli.
  • Re: Struct, file e fprintf: come sostituire una fwrite con una fprintf

    I file di testo vanno scritti in testo formattato, ovviamente. L’estensione .txt indica un file di testo, quindi è ovvio che non andrai a scriverci dati binari in esso (per cui esistono altre estensioni come .bin e .dat).
    Ma testo e binario sono due cose totalmente separate, il testo si utilizza prettamente per file leggibili, html, xml, json… mentre i binari per serializzare dati.
    Prendi l’esempio di prima: 1617205 puoi scriverlo come "1617205" cioè 7 caratteri, ognuno da 1 byte (ASCII) o come 4 byte. Se hai molti interi quale metodo andrai a preferire? Poi ci sono eccezioni come appunto xml e json…
Devi accedere o registrarti per scrivere nel forum
31 risposte