|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2006
Messaggi: 3808
|
[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?
Codice:
#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); } } } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
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 ![]()
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli! ![]() |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
|
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 |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Dec 2006
Messaggi: 3808
|
Quote:
|
|
![]() |
![]() |
![]() |
#5 | |
Member
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
|
Quote:
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 |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:31.