04.06.2008 | 22:12:22
immagine
Ing. Emanuele Scapin

C, es1, proposta di correzione esercitazione n.1 su elenco libri.
Estensione con esportazione e importazione su file di testo e file binari.
  • Procedura di esportazione su file binario.

    void esporta(char *nomefile, t_libro elenco[], const int n) {
        if (strlen(nomefile) > 0) {
            FILE *f;
            f = fopen(nomefile, "wb");
            
            if (f != NULL) {
                int i;
                for(i=0; i<n; i++) {
                    fwrite(&elenco[i], sizeof(t_libro), 1 , f);
                }
            }
            
            fclose(f);
        }
    }
            
  • Procedura di esportazione su file di testo in formato CSV.

    // file di testo in formato CSV
    void esportaTesto(char *nomefile, t_libro elenco[], const int n) {
        if (strlen(nomefile) > 0) {
            FILE *f;
            f = fopen(nomefile, "w");
            
            if (f != NULL) {
                fprintf(f, "titolo;autore;numeropagine;prezoo;editore;\n");
                int i;
                for(i=0; i<n; i++) {
                    fprintf(f, "%s;%s;%d;%f;%s;\n", 
                            elenco[i].titolo, 
                            elenco[i].autore, elenco[i].numeropagine,
                            elenco[i].prezzo, elenco[i].editore);
                }
            }
            
            fclose(f);
        }
    }
            
  • Procedura di importazione da file binario.

    void importa(char *nomefile, t_libro elenco[], int *n) {
        *n = 0;
        if (strlen(nomefile) > 0) {
            FILE *f;
            f = fopen(nomefile, "rb");
            
            if (f != NULL) {
                int i = 0;
                while (!feof(f)) {
                    fread(&elenco[i], sizeof(t_libro), 1 , f);
                    i++;
                }
                *n = i;
            }
    
            fclose(f);
        }
    }
            
  • Procedura di importazione da file di testo in formato CSV.
    Si utilizzi %[^;] anzichè %s per leggere una stringa fino al primo ; trovato, altrimenti si leggerebbe una stringa qualsiasi, quindi l'intera riga.

    // file di testo in formato CSV
    void importaTesto(char *nomefile, t_libro elenco[], int *n) {
        *n = 0;
        if (strlen(nomefile) > 0) {
            FILE *f;
            f = fopen(nomefile, "r");
            
            if (f != NULL) {
                int i = 0;
                char *titolo;
                // lettura prima riga con titoli delle colonne
                fscanf(f, "%[^;];%[^;];%[^;];%[^;];%[^;];\n", 
                          titolo, titolo, titolo,
                          titolo, titolo);
                // lettura righe successive con i dati
                while (fscanf(f, "%[^;];%[^;];%d;%f;%[^;];\n", 
                            elenco[i].titolo, elenco[i].autore, 
                            &elenco[i].numeropagine,
                            &elenco[i].prezzo, 
                            elenco[i].editore) != EOF) {
                    i++;
                }
                *n = i;
            }
    
            fclose(f);
        }
    }
            

© Emanuele Scapin 2009-2016

 

Valid HTML 4.01! Valid CSS!