RISOLTO Problema con la lettura di più strutture da un file in linguaggio c

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

Ziuccio

Nuovo Utente
Messaggi
6
Reazioni
1
Punteggio
2
Buongiorno a tutti.
Non ho capito bene come fare la lettura di un singolo campo di una struttura contenuta in un file e successivamente passare a una seconda struttura, contenuta nello stesso file, e leggere sempre lo stesso campo con valore diverso.
Io scrivo queste strutture con fwrite e avevo pensato di leggerle con fread, però quando faccio leggere la struttura al programma mi legge solamente i campi della prima struttura senza andare avanti alla seconda.

C:
struct paziente {
    char nome[N];
    char cognome[N];
    char indirizzo[N];
};
paziente p1, p2;
 
Ciao, la prossima volta che pubblichi del codice utilizza l'apposito tag CODE. Per questa e altre info ti invito a leggere il regolamento di sezione, Regolamento ed informazioni utili sulla sezione programmazione.

Dovresti mostrare tutto il codice che hai scritto, altrimenti risulta difficile esserti d'aiuto.
Va bene. Vorrei comunque riformulare la mia domanda.
Teoricamente avendo un file contenente più strutture, come faccio a prendere solo la prima struttura o solo la seconda o solo la terza?
 
Va bene. Vorrei comunque riformulare la mia domanda.
Teoricamente avendo un file contenente più strutture, come faccio a prendere solo la prima struttura o solo la seconda o solo la terza?

Con fread dovresti leggere la struttura su file; se vuoi leggere la seconda, dovrai fare 2 fread, se vuoi la terza saranno 3 fread.
Questo se devi leggere riga per riga è il modo migliore.

Se devi leggere una precisa struttura (per dire, la seconda, saltando la prima), puoi fare una cosa più "furba": utilizzare fseek e muovere il file pointer di N byte (indice * sizeof(tua_struttura)). A questo punto farai una fread e prenderai la struct all'indice X.

Se sei su Windows e su file hai proprio scritto la struct, dovrai aprire il file in lettura con rb, in quanto non stai leggendo un file ASCII, ma un file in binario.
 
Ho un'altra domanda. Le strutture all'interno del file, dovrebbero essere state scritte in modalità binaria per poterle aprire in modalità lettura binaria?
 
Va bene, grazie della risposta.
Ho un altro dubbio. Questa è una funzione che ho fatto e si occupa di stampare i campi della struttura paziente che vengono prelevati dal file DataBaseStrutture 2 volte. Il problema insorge quando mando in esecuzione il programma. Nel momento in cui dovrebbe stamparmi i campi delle strutture paziente, il contenuto dei campi non viene stampato correttamente. Le strutture vengono scritte nei file in modalità "a" e invece quando lo leggiamo il file viene aperto in modalità "rb".
Qua sotto c'è scritto il codice della funzione leggiFile:

C:
void leggiFile(FILE *pazL, struct paziente p){
    int l,y;
    l=2;
    pazL = fopen("DataBaseStrutture.txt", "rb");
    if(pazL == NULL)
    {
        fprintf(stderr,"\nIl file non si apre\n");
        exit(1);
    }

    y = ftell(pazL);
    printf("y e':%d\n",y);
    fread(&p, sizeof(p),1,pazL);
    printf("il nome della prima struttura e':%s\n",p.nome);
    printf("il cognome della prima struttura e':%s\n",p.cognome);
    printf("il codice fiscale della prima struttura e':%s\n",p.codice_fiscale);
    printf("il numero del paziente della prima struttura e':%d\n",p.numero_paziente);

    fseek(pazL,752,0);
    y = ftell(pazL);
    printf("y e':%d\n",y);
    fread(&p, sizeof(p),1,pazL);
    printf("il nome della seconda struttura e':%s\n",p.nome);
    printf("il cognome della seconda struttura e':%s\n",p.cognome);
    printf("il codice fiscale della seconda struttura e':%s\n",p.codice_fiscale);
    printf("il numero del paziente della seconda struttura e':%d\n",p.numero_paziente);
}


Mentre la struttura a cui fa riferimento è:

C:
struct paziente {
    char nome[N];
    char cognome[N];
    char indirizzo[N];
    int  numero_civico;
    int eta;
    data dataDiNascita;
    sesso sesso_paziente;
    char codice_fiscale[CN];
    char def_malattia[DN];
    int numero_camera;
    servizio servizio_paziente;
    char atti_medicali[NA];
    int spese_attimedicali;
    int numero_paziente;
};

Gentilmente qualcuno potrebbe aiutarmi a capire dov'è il problema?
In allegato mando pure uno screenshot dell'esecuzione del programma.
 

Allegati

  • errore.webp
    errore.webp
    31.4 KB · Visualizzazioni: 25
Le strutture vengono scritte nei file in modalità "a" e invece quando lo leggiamo il file viene aperto in modalità "rb".
Mi sono soffermato su questo: devi scrivere usando "ab".

Se continui ad avere problemi pubblica l'intero codice, così possiamo avere un quadro più completo.
 
Il problema sta nella istruzione
C:
fseek(pazL,752,0);
Perché mai sposti il cursore? Se vuoi leggere la seconda struttura non hai bisogno di nessun fseek (cosa sarebbe poi quel numero 752), in quanto hai appena letto la prima, quindi la seconda lettura inizia dove hai terminato la prima.
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top