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

    [c]Inizializzare Struct da file dinamicamente

    Ho un esercizio nella quale devo creare una funzione:
    codice:
    extern struct libro *read_libri (const char *filename, unsigned int *pn);
    La funzione accetta come parametro un nome di file che deve essere aperto in lettura in modalità tradotta (testo) e un puntatore ad una variabile di tipo unsigned int in cui si dovrà inserire il numero di libri presenti in un file così strutturato: ;;
    La funzione deve ritornare un puntatore ad una nuova zona di memoria (allocata dinamicamente nell’heap) contenente tutti i libri letti dal file. Il numero di libri non è noto a priori e non può essere vincolato dal codice.
    codice:
    extern struct libro *read_libri (const char *filename, unsigned int *pn){    FILE *f;    
    f=fopen(filename,"rt");        
    if(f==NULL)            
    exit(EXIT_FAILURE);     
    struct libro *lib=NULL;            
    int i=0;    
    while(feof(f)==0){        
    lib=(struct libro *)realloc(lib,(i+1)*sizeof(struct libro));                
    fscanf(f,"%u;%s;%u",&lib[i].codice,lib[i].titolo,&lib[i].pagine);        
    i++;    }            
    return lib;    
    fclose(f);    
    free(lib); 
    }
    Ho come risultato un ciclo infinito, non riesco a capire il perché,come posso fare?
    NOTA: Devo utilizzare un compilatore Pelles c.
    Ultima modifica di andrea485; 30-01-2014 a 15:43

  2. #2
    il file è strutturato in questo modo codice;titolo;pagine\n

    esempio:
    23875;Il codice da Vinci(Dan Brown);64
    Ultima modifica di andrea485; 30-01-2014 a 17:55

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    A parte che il codice non è identato, ci sono un po' di errori:
    fclose e free non saranno mai eseguiti
    %s legge fino a uno spazio bianco ed in ogni caso dovresti usare fscanf
    non setti pn
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    
    struct libro {
        unsigned codice;
        char titolo[30];
        unsigned pagine;
    };
    
    
    struct libro *read_libri (const char *filename, unsigned int *pn){
        FILE *f;
        char buffer[500];
        f=fopen(filename,"rt");        
        if(f==NULL)            
        exit(EXIT_FAILURE);     
        struct libro *lib=NULL;            
        int i=0;    
        while(feof(f)==0){        
            lib = (struct libro *)realloc(lib,(i+1)*sizeof(struct libro));
            
            fgets(buffer, 500, f);
            lib[i].codice = atoi(strtok(buffer, "\n\r;"));
            strcpy(lib[i].titolo, strtok(NULL, "\n\r;"));
            lib[i].pagine = atoi(strtok(NULL, "\n\r;"));
            i++;
        }
        fclose(f);
        *pn = i;
        return lib; 
    }
    
    
    int main()
    {
       int i;
       unsigned pn;
       struct libro *lib = read_libri("input.txt", &pn);
       for(i = 0; i < pn; i++) {
           printf("%u;%s;%u\n", lib[i].codice, lib[i].titolo, lib[i].pagine);
       }
       free(lib);
       return 0;
    }
    Ultima modifica di Scara95; 30-01-2014 a 18:39
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Grazie mille, ho comunque un problema in fase di esecuzione, eseguendolo istruzione per istruzione su visual studio ho notato che per quanto riguarda l'inizializzazione va tutto ok, per quanto riguarda il ciclo no, infatti ho il ciclo while che non termina. Non so da cosa dipendi.

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da andrea485 Visualizza il messaggio
    Grazie mille, ho comunque un problema in fase di esecuzione, eseguendolo istruzione per istruzione su visual studio ho notato che per quanto riguarda l'inizializzazione va tutto ok, per quanto riguarda il ciclo no, infatti ho il ciclo while che non termina. Non so da cosa dipendi.
    Sei sicuro?
    A me in esecuzione non da alcun problema, per cui non ho visto la necessità del debugging.
    Nel file di input l'ultima riga è una riga vuota? O finisce con un record?
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    E' una riga vuota.

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da andrea485 Visualizza il messaggio
    E' una riga vuota.
    Toglila, oppure aggiungi un controllo nel ciclo per saltarla...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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