Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17

Discussione: [C]Problemi con feof()

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    11

    [C]Problemi con feof()

    Ciao, sono nuovo del forum, non capisco proprio deove sia il problema in questi 3 programmi.
    In partica è un'archivio di cd. Con il primo programma, carico i vari record, con il secondo li mostro e con il terzo li modifico aggiungo etc, etc..
    Il problema è quando li devo mostrare, poichè sembra che mettendo feof() mi conta un record in più. Es: se ho inserito tre record, lui me ne mostra 4 copiando il 3 nel 4 .
    Ecco i tre programmi:
    codice:
    #include <stdlib.h>
    #include <stdio.h>
    
    struct rec
           {
           char titolo[30], autore[30];
           float durata;
           };
    
    int main()
    {
        struct rec cd;
        int i;
        
        FILE*list;
        list=fopen("dati.bin", "w");
        
        for(i=0;i<3;i++)
        {
                        printf("Titolo?\n");
                        scanf("%s", cd.titolo);
                        printf("Autore?\n");
                        scanf("%s", cd.autore);
                        printf("Durata (in minuti)?\n");
                        scanf("%f", &cd.durata);
                        fwrite(&cd,sizeof(struct rec),1,list);
                        system("CLS");
        }                
        fclose(list);
            
        system("PAUSE");
        return 0;
    }
    codice:
    #include <stdlib.h>
    #include <stdio.h>
    
    struct rec
           {
           char titolo[30], autore[30];
           float durata;
           };
    
    int main()
    {
        struct rec cd;
        int i;
        FILE*list;
        list=fopen("dati.bin", "r");
        
        for(i=0;!feof(list);i++)
        {
                        fread(&cd,sizeof(struct rec),1,list);
                        printf("Titolo %s \n", cd.titolo);
                        printf("Autore %s \n", cd.autore);
                        printf("Durata:%f \n", cd.durata);
            
        }                
        fclose(list);
        
        system("PAUSE");
        return 0;
    }
    Aggiungop anche il terzo anche se penso che il problema sia nei primi 2:
    codice:
       #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    struct rec
           {
           char titolo[30], autore[30];
           float durata;
           };
           
    int show_user(struct rec cd,FILE*list)
    {
        char titolo[30];
        int i;
        
        list=fopen("dati.bin", "r");
        printf("Titolo dell'album che vuoi cercare?\n");
        scanf("%s", titolo);
        for(i=0;!feof(list);i++)
        {
                        fread(&cd,sizeof(struct rec),1,list);
        
        if((strcmp(titolo,cd.titolo))==0)
                        {
                                                          
                                                          printf("Titolo %s \n", cd.titolo);
                                                          printf("Autore %s \n", cd.autore);
                                                          printf("Durata:%f \n", cd.durata);
                        }
         } 
         fclose(list);                                                
        
        
        return 0;
    }    
    
    int edit_user(struct rec cd,FILE*list)
    {
        char titolo[30];
        int i,n;
        list=fopen("dati.bin", "r+");
        printf("Titolo dell'album che vuoi modificare?\n");
        scanf("%s", titolo);
        for(i=0;!feof(list);i++)
        {
                        fread(&cd,sizeof(struct rec),1,list);
                        if(strcmp(titolo,cd.titolo)==0)
                        break;
        }
        fseek(list,i*sizeof(struct rec), SEEK_SET);
                        printf("Titolo?\n");
                        scanf("%s", cd.titolo);
                        printf("Autore?\n");
                        scanf("%s", cd.autore);
                        printf("Durata (in minuti)?\n");
                        scanf("%f", &cd.durata);
                        fwrite(&cd,sizeof(struct rec),1,list);
        return 0;
    }
                    
    int add(struct rec cd,FILE*list)
    {
        list=fopen("dati.bin", "a"); 
        printf("Titolo?\n");
        scanf("%s", cd.titolo);
        printf("Autore?\n");
        scanf("%s", cd.autore);
        printf("Durata (in minuti)?\n");
        scanf("%f", &cd.durata);
        fwrite(&cd,sizeof(struct rec),1,list);
        fclose(list);
        return 0;
    
    } 
         
    int main()
      {
        struct rec cd;
        int i,function1;
        
        FILE*list; 
        show_user(cd,list);
        edit_user(cd,list);
        add(cd,list);
        
                
        system("PAUSE");
        return 0;
      }
    Grazie a tutti quelli che mi potranno aiutare, martedì ho il compito e non riesco a risolvere....

  2. #2

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    11
    Originariamente inviato da MacApp
    A prima vista NON controlli il valore restituito da "fopen". Ami il rischio?
    Che significa non controlli?

  4. #4
    Originariamente inviato da stgww
    Che significa non controlli?
    dalla mia documantazione della fopen:

    RETURN VALUES
    Upon successful completion fopen(), fdopen() and freopen() return a FILE
    pointer. Otherwise, NULL is returned and the global variable errno is
    set to indicate the error.
    Insomma se ti restutuisce NULL e tu usi quel valore hai un bel comportamento indefinito, che vuol dire: se sei fortunato hai un bel crash dell'applicazione, altrimenti qualunque altra cosa potrebbe accadere (e generalmente non trattasi di una vincita milionaria al superenalotto).

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    11
    Originariamente inviato da MacApp
    dalla mia documantazione della fopen:



    Insomma se ti restutuisce NULL e tu usi quel valore hai un bel comportamento indefinito, che vuol dire: se sei fortunato hai un bel crash dell'applicazione, altrimenti qualunque altra cosa potrebbe accadere (e generalmente non trattasi di una vincita milionaria al superenalotto).
    Quindi, in pratica cosa dovrei fare?

  6. #6
    Mi pare che MacApp sia stato abbastanza chiaro...
    codice:
        FILE*list;
        list=fopen("dati.bin", "w");
        if(list==NULL)
        {
            fputs("Impossibile aprire dati.bin in scrittura.",stderr);
            exit(1);
        }
    Lo stesso dicasi per tutti gli altri casi in cui usi la fopen.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    11
    Originariamente inviato da MItaly
    Mi pare che MacApp sia stato abbastanza chiaro...
    codice:
        FILE*list;
        list=fopen("dati.bin", "w");
        if(list==NULL)
        {
            fputs("Impossibile aprire dati.bin in scrittura.",stderr);
            exit(1);
        }
    Lo stesso dicasi per tutti gli altri casi in cui usi la fopen.
    Ah, ok!
    Solo che la prof non ci ha spiegato fputs, stderr...

    Cmq per quell'altro problema, sai qualcosa?

  8. #8
    Originariamente inviato da stgww
    Ah, ok!
    Solo che la prof non ci ha spiegato fputs, stderr...

    Cmq per quell'altro problema, sai qualcosa?
    Se non controlli gli errori che vengono restituiti dalle funzioni che chiami, il comportamento indefinito, indefinibile dei tuo programmini, è pressoché garantito.

  9. #9
    Solo che la prof non ci ha spiegato fputs, stderr...
    Sono assolutamente irrilevanti per la faccenda della gestione degli errori, potevi scrivere quella riga anche con la printf e non cambiava praticamente niente (avresti scritto su stdout invece che su stderr, ma queste sono finezze). La cosa importante è controllare i valori restituiti da funzioni che possono fallire.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    prova a leggere i dati così

    codice:
    ...
    	while (fread(&cd, sizeof(struct rec), 1, list) > 0) {
                        printf("Titolo %s \n", cd.titolo);
                        printf("Autore %s \n", cd.autore);
                        printf("Durata:%f \n", cd.durata);
    }
    ...
    dovrebbe risolvere il problema
    ciao
    sergio

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