[C] Lettura da file binario (o testuale)... con fscanf???
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:
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?
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
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
ANNO ; COGNOME Nome ; nazione ; squadra
Se sembra testo lo è. Io proverei a leggerlo in modo testuale, se fallisce al massimo cambi.
"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?
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++.
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++.
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.
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.
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.