Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - problemi file
Forum - C/C++ - problemi file

Avatar
Raghnash (Normal User)
Newbie


Messaggi: 3
Iscritto: 30/03/2009

Segnala al moderatore
Postato alle 8:44
Venerdì, 03/04/2009
Ciao a tutti. Premetto che ho iniziato con c da qualche settimana e quindi potrei anche commettere errori madornali:-|
Il mio problema sta in questa funzione:

int records (FILE * fp)
{
    
    int h, asd, asd2, sott, min, menur, j;
    nome *nom, *nom2, nom3;
    
    
    do
    {
        
        men:
        rewind(fp);
        min=0;
        h=0;
        system("cls");
        printf("\n\t\t---RECORDS---\n\n\n\n");
        sleep(200);
        printf(" [1]Visualizza Record vittorie\n [2]Numero partite giocate\n [3]Resetta lista\n [0]Esci\n\n");
        fflush(stdin);
        scanf("%d", &menur);
        switch(menur)
        {
            case 1:     while(!feof(fp))
                    {
                        fscanf(fp, "%d %d", &asd, &asd2);
                        sott=asd-asd2;
                        if(sott>min)
                        {min=sott;}
                    }
                      rewind(fp);
                          while(!feof(fp))
                    {
                        fscanf(fp, "%d %d", &asd, &asd2);
                        if((asd-asd2)==min)
                        { fscanf(fp, "%s", nom3);
                          printf("%s Vittorie %d Sconfitte %d\n", nom3, asd, asd2);
                        }
                    }        
            break;
            case 2    :    printf("\nInserire nome del giocatore: ");
                    nom2=malloc(sizeof(nome));
                    scanf("%s", nom2);
                    while(!feof(fp))
                    {
                        nom=malloc(sizeof(nome));
                        fscanf(fp, "%s", nom);
                        if((strcmp( *nom, *nom2))==0)
                        {
                            ++h;
                        }
                    free(nom);
                    free(nom2);
                    }
                    printf("\n %s ha giocato dall'ultimo aggiornamento %d partite.", nom, h);
                    sleep(2000);
            break;
            case 3:        fclose(fp);
                    if((j=remove("record.txt"))!=0)
                    printf("\n\nERRORE CANCELLAZIONE FILE!\n\n");
                    system("PAUSE");
                    exit(1);
            break;
            case 0 :goto end;
            break;
            default: goto men;
            break;
        }
    }while(menur != 0);
    end:
    return 4;
}

Non mi funzionano le prime 2 opzioni :(
Allego tutto il programma nel caso ci fosse bisogno.
Se poi aveste qualche consiglio sono lieto di accettarlo

PM Quote
Avatar
andrea.b89 (Ex-Member)
Pro


Messaggi: 129
Iscritto: 03/03/2009

Segnala al moderatore
Postato alle 11:28
Venerdì, 03/04/2009
1 - La prossima volta scrivi il codice dentro il tag code che così viene più ordinato
2 - Dire che non funziona è un pò troppo generico. Magari se riesci specifica che cosa non  
    funziona.
3 - Puoi fare un esempio di cosa ci può essere scritto all'interno del file?
4 - Poi scrivi come hai definito il tipo nome.

Spero di essere stato chiaro :k:

PM Quote
Avatar
Raghnash (Normal User)
Newbie


Messaggi: 3
Iscritto: 30/03/2009

Segnala al moderatore
Postato alle 11:41
Venerdì, 03/04/2009
Questo è il programma completo.

Il problema è che appena seleziono l'opzione 1 o 2 le istruzioni, appena il programma è arrivato alla fscanf o al ciclo while, non scorrono e il prgramma si blocca.


Raghnash ha allegato un file: sass.zip (1989 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da Raghnash il 03/04/2009 alle 11:42
PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 10:56
Sabato, 04/04/2009
prima cosa: non e ripeto NON usare mai i goto, che servono sono ad incasinare il codice e sono inutili visto che ci sono altre soluzioni più chiare per ottenere lo stesso risultato


e poi non funziona oppure ti da degli errori? Io l'ho provato su vc++ e ci sono taaanti errori....anche modificando la sleep dato che quella che hai messo tu è per linux(su che s.o. stai provando?)


cmq ho guardato il codice e:

1)controlla i nomi delle funzioni che alcuni sono sbagliati(recors invece di records)
2)guardati bene come si usa la malloc
La malloc ritorna un puntatore a void per lo spazio allocato di dimensione sizeof(...)
Prima di metterlo nella tuia variabile giocatore devi effettuare un cast così:

giocatore = (nome *)malloc(sizeof(nome));

Ultima modifica effettuata da lorenzo il 04/04/2009 alle 11:03
PM Quote
Avatar
Raghnash (Normal User)
Newbie


Messaggi: 3
Iscritto: 30/03/2009

Segnala al moderatore
Postato alle 17:54
Sabato, 04/04/2009
A me errori nella compilazione e nell'esecuzione non ne da... uso per compilare Mingw e il mio sistema operativo è windows visto che uso anche system ("cls"). Per quanto ai goto e sleep ora li modifico se dici che danno fastidio. In caso mi potreste aiutare a rifare proprio la funzione dei records? Era per allenarsi sui file ma non ho trovato esempi su cui basarmi. Poi una domanda.. Se io già ho dato un tipo al puntatore lo devo ridare quando uso la malloc?
Grazie, io intanto ricomincio a studiare allocazione dinamica e file:d

Ultima modifica effettuata da Raghnash il 04/04/2009 alle 18:02
PM Quote