[C] Lettura da file binario (o testuale)... con fscanf???

Atem1
Salve ragazzi, ho un esercizio "strano" che mi da questo file .dat (quindi ne deduco che sia binario) che però sembra essere formattato come se fosse testuale. L'esercizio dice che ogni riga di questo file rappresenta ogni anno dell'albo d'oro del giro d'Italia. Ogni informazione è separata dal carattere ";" es:
1938: VALLETTI Giovanni ; ita ; Frejus

Le informazioni sono rispettivamente:
ANNO ; COGNOME Nome ; nazione ; squadra



E poi va beh c'è la lista di richieste ma quello che voglio capire io è se va trattato come file binario o come file testuale.
Io uso la seguente procedura che funziona:

link leggiFile(FILE *fp, link head)
link leggiFile(FILE *fp, link head)
{
    int anno;
    link ciclista;
    char s1[MAXCHARS];
    char s2[MAXCHARS];
    char s3[MAXCHARS];
    char s4[MAXCHARS];

    while (fscanf(fp, "%d ; %s %[^;]; %[^;]; %[^\n]", &anno, s1, s2, s3, s4)>0)
    {
        ciclista=malloc(sizeof(*ciclista));
        ciclista->anno=anno;
        ciclista->cognome=malloc((1+strlen(s1))+(sizeof(char)));
        strcpy(ciclista->cognome, s1);
        ciclista->nome=malloc((1+strlen(s2))+(sizeof(char)));
        strcpy(ciclista->nome, s2);
        ciclista->nazione=malloc((1+strlen(s3))+(sizeof(char)));
        strcpy(ciclista->nazione, s3);
        ciclista->squadra=malloc((1+strlen(s4))+(sizeof(char)));
        strcpy(ciclista->squadra, s4);
        ciclista->next=NULL;
        head=insertTail(head, ciclista);
    }


    return head;
}



Ho trattato un file binario come se fosse testuale?
Come devo agire in questi casi?
Va bene quello che ho fatto o, sebbene funzioni, è concettualmente sbagliato?

Risposte
Atem1
A proposito, visto che nello screenshot si vede male, faccio notare che alla fine di ogni riga c'è il quadratino che sta ad indicare il carattere di fine riga, quindi ogni riga contiene esattamente queste informazioni:
ANNO ; COGNOME Nome ; nazione ; squadra

vict85
Se sembra testo lo è. Io proverei a leggerlo in modo testuale, se fallisce al massimo cambi.

Atem1
"vict85":
Se sembra testo lo è. Io proverei a leggerlo in modo testuale, se fallisce al massimo cambi.

Ah ok grazie mille in effetti mi sembrava strano dover applicare la fread a una cosa del genere.
In ogni caso, la procedura che ho usato per leggere il file è quella che ho scritto sopra e funziona sia se lo apro così:
fp=fopen(filename, "r");


sia che lo apro così:
fp=fopen(filename, "rb");


Quindi nonostante l'estensione .dat è in realtà un file testuale, ma allora perchè viene visualizzato quel quadratino invece di andare a capo?

claudio862
Se il testo dell'esercizio parla di "righe" allora si tratta inequivocabilmente di un file testuale.
Il motivo per cui viene visualizzato un quadratino (quello è il blocco note, vero?) è probabilmente che il file è salvato con il terminatore di linea unix '\n', mentre su Windows si usa "\r\n". Prova ad aprirlo con un editor più avanzato come Sublime Text o Notepad++.

vict85
Non avevo notato il quadratino, comunque editor come Notepad++ possono modificare il terminatore facilmente (per adattarlo ai tuoi scopi). Su Notepad basta dare "Modifica>Converti carattere di fine linea>Formato Windows" anche se lui non dovrebbe darti problema per visualizzarlo.

Atem1
Si infatti se uso Notepad++ alla fine di ogni riga non c'è il quadratino ma si va a capo.
Il mio blocco note non ha l'opzione "Modifica>Converti carattere di fine linea>Formato Windows"
Cioè dopo "Modifica" non c'è Converti...

Comunque grazie mille mi avete tolto un dubbio esistenziale.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.