Aiuto debugging

di il
6 risposte

Aiuto debugging

Salve ragazzi, nuovo giorno, nuovo bug.
Ho appena terminato un progetto in c, l'ultimo in c della mia carriera universitaria, finalmente. Tutto sembra funzionare benissimo tranne una funzione. Questa funzione dovrebbe permettere all'utente di cercare un record tramite codice id (intero facente parte di una struct) e poi modificare i dati di quel record. Ecco il codice:

FILE *writePatient = fopen("dati_pazienti.dat", "rb+");
    if (writePatient == NULL) {

        fprintf(stderr, "\nError opening file\n");
        exit(1);
    }
    else {
        puts("Inserire ID dell'account da cancellare.");
        int editId;
        scanf("%d", &editId);
        
        int daSize = sizeof(struct generalPatient);
        while (fread(&patient, daSize, 1, writePatient))
        {
            if (editId == patient.id){
            fai roba
            }
Altre funzioni simili, che cioè funzionano per ricerca di codice id funzionano mentre questa non trova mai alcuna corrispondenza, qualunque id io inserisca.

Ho scritto la funzione di registrazione del paziente aprendo il file in modalità "a", in modo che il record sia scritto sempre alla fine del file. Quella funzione salva l'id in questo modo:

srand(time(NULL));
patient.id=1 + rand()%9999;
e scrive i dati così:

fwrite (&patient, sizeof(struct generalPatient), 1, writePatient);
Per essere ancora più chiaro, ho scritto un'altra funzione che cerca il record paziente tramite id al semplice scopo di visualizzarlo e questa funziona benissimo:

readPatientPointer = fopen ("dati_pazienti.dat", "r");//apertura file
    if (readPatientPointer == NULL){
        fprintf(stderr, "\nError opening file\n");
        exit (1);
    }else{
        int check=0;//variabile di controllo per la riuscita del login
        puts("Inserire ID del paziente da ricercare.\nInserire qualunque carattere per uscire dal programma.");
        int searchId;
        if(scanf("%d", &searchId)!=1){
            puts("Programma terminato.");
            return EXIT_SUCCESS;
        }

        while(fread(&patientRead, sizeof(struct generalPatient), 1, readPatientPointer)){//stampo il record
                if(searchId==patientRead.id){
                fai roba
                }
Dove potrebbe essere il problema?

6 Risposte

  • Re: Aiuto debugging

    Ti faccio notare che hai usato, in un caso, l'accesso binario "rb+", e nell'altro l'accesso in modo testo "r". Fra l'altro scrivi in modo testo "a" usando poi fread e fwrite tipiche della modalità binaria.

    Insomma un miscuglio che mi pare ovvio ti dia problemi.

    Se usi stutture (e fread e fwrite), accedi sempre in modo binario, per scrivere e leggere.

    A questo punto, elimina il file dei dati e riscrivilo con la modalità corretta.
  • Re: Aiuto debugging

    Quindi è per questo che dovrei usare sempre il binario? Se uso semplici variabili devo usare w r a mentre per le strutture devo usare sempre il binario? Comunque ho appena notato che il codice funziona se ricerco i primi 6 record, mentre non trova tutti gli altri. Provo a fare come dici e ti aggiorno.
  • Re: Aiuto debugging

    No.

    Ti avevo precisato

    "Se usi stutture (e fread e fwrite)"

    allora usa la modalità binaria.

    Con la modalità testo, anche con le strutture puoi usare fprintf e fscanf

    Ma non fare miscugli.
  • Re: Aiuto debugging

    Ho capito...comunque ho semplicemente cambiato la modalità di lettura da rb+ a r+ e adesso funziona, legge tutti gli id. Quindi o si mette tutto in binario oppure tutto in modalità testo, capito.
  • Re: Aiuto debugging

    Sarebbe preferibile la modalità binaria con fread e fwrite ma fa come vuoi...
  • Re: Aiuto debugging

    Si l'avevo capito anche dai precedenti thread in cui me l'hai detto ma per ora mi basta che sto programma funzioni. Certo vorrei capire meglio, nei dettagli...voglio dire, non credo che l'uso preferibile della modalità binaria con fread/fwrite sia una semplice convenzione
Devi accedere o registrarti per scrivere nel forum
6 risposte