View Full Version : [C] lettura in binario di un file
ho creato questo semplice programma e cambiando la modalità di lettura del file da r a rb non vedo variazioni: cosa significa? cosa significa che fopen mi apre in binario il file? e cosa fa fopen nell'altro caso con la sola r?
#include <stdio.h>
readFile(char*);
int main(){
readFile("Untitled1.c");
}
readFile(char myString[]){
FILE* myF;
myF=fopen(myString,"rb");
if(myF==NULL){
printf("\nPROBLEMI DURANTE L'ACCESSO AL FILE %s\n",myString);
} else {
char myC;
while(fscanf(myF,"%c",&myC)!=EOF){
printf("%c",myC);
}
}
}
ingframin
22-09-2011, 20:15
Per un file di testo non c'è nessuna differenza perché 1 carattere = 1 byte.
Prova a leggere un file di testo unicode on file contenente interi. Se non lo leggi con rb, non sei in grado di ricostruire correttamente quello che leggi.
Se però qualche anima pia più esperta di me ti sa dare una spiegazione migliore ben venga :sofico:
Secondo lo standard (C89 mi pare) esistono due tipi di file: testo e binari. Non è però richiesto che il sistema operativo distingua tra i due.
Un file di testo è caratterizzato dall'essere diviso in linee, separate da un qualche tipo di sequenza, che dipende dal sistema operativo: LF(0x0a) su Unix, CR(0x0d) sui vecchi MacOS, CRLF su DOS,Windows,OS/2.
E qui c'è il trucco:
su Unix, per esempio, non fa differenza aprire un file con o senza il "b" (vedi anche man 3 fopen): per ogni "a capo logico" nel file c'è un byte (LF) e quello ti becchi.
Su Win, per ogni a "capo" logico nel file ci sono due byte: CR e LF. se apri un file come "b" li vedi entrambi, se lo apri come testo la sequenza ti viene tradotta al volo in un solo LF.
In scrittura avviene il contrario: se sei in modalità testo il tuo LF viene scritto senza modifiche su Unix e invece trasformato in un CRLF su Win, se sei in modalità binaria nessuna modifica accade e ogni byte viene scritto raw.
vedi anche http://en.wikipedia.org/wiki/Newline
ciao!
british
Secondo lo standard (C89 mi pare) esistono due tipi di file: testo e binari. Non è però richiesto che il sistema operativo distingua tra i due.
Un file di testo è caratterizzato dall'essere diviso in linee, separate da un qualche tipo di sequenza, che dipende dal sistema operativo: LF(0x0a) su Unix, CR(0x0d) sui vecchi MacOS, CRLF su DOS,Windows,OS/2.
E qui c'è il trucco:
su Unix, per esempio, non fa differenza aprire un file con o senza il "b" (vedi anche man 3 fopen): per ogni "a capo logico" nel file c'è un byte (LF) e quello ti becchi.
Su Win, per ogni a "capo" logico nel file ci sono due byte: CR e LF. se apri un file come "b" li vedi entrambi, se lo apri come testo la sequenza ti viene tradotta al volo in un solo LF.
In scrittura avviene il contrario: se sei in modalità testo il tuo LF viene scritto senza modifiche su Unix e invece trasformato in un CRLF su Win, se sei in modalità binaria nessuna modifica accade e ogni byte viene scritto raw.
vedi anche http://en.wikipedia.org/wiki/Newline
ciao!
british
ti ringrazio per la precisazione puntuale sui file di testo ma vorrei capire in generale a che serve e che differenza ci sia tra le due modalità, anche aprendo altri tipi di file.
ti ringrazio per la precisazione puntuale sui file di testo ma vorrei capire in generale a che serve e che differenza ci sia tra le due modalità, anche aprendo altri tipi di file.
La differenza è nella traduzione (sia in lettura che in scrittura) o meno delle sequenze di fine linea.
Questa traduzione ti serve se stai leggendo un file a contenuto testuale "cantami o diva/l'ira del pelide achille..." in cui ti interessa sapere dove inizino e finiscano le linee ma poi come il separatore di fine linea sia memorizzato effettivamente, beh, non è tuo problema.
Viceversa se stai leggendo un file a contenuto "binario" (nel senso "non testuale"), magari un'immagine, tu vuoi che due byte 0x0D e 0x0A che sono fisicamente presenti (e contigui) nel file e magari in questo esempio ti rappresentano il valore di un certo pixel ti vengano forniti effettivamente come un byte 0x0D e un byte 0x0A, e non tradotti in un solo 0X0A da un zelante sistema che pensa si tratti di una fine linea in mezzo all'Iliade.
ciao!
british
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.