Il giorno mercoledì 28 novembre 2012 23:27:16 UTC+1,
fma...@gmail.com ha scritto:
> Oh my.
> Sembra di parlare in un NG di politica :-)
> Facciamo parlare il codice, OK?
[...]
> Adesso, per piacere, facciamo gli esempi con questo codice? Su cosa fa su win,
> su unix, su linux o dove ci pare a noi? Non so neppure se è giusto perché l'ho
> scritto di getto, per cui magari si corregge, si aggiunge o si commenta.
quasi perfetto, compilmenti: io quando scrivo di getto scrivo di quelle
boiate! Nel tuo codice andava solo aggiunto il main() e gli #include mancanti :)
#include <stdio.h>
#define FILENAME "pippo.dat"
#define WRITEFLAG "w"
#define READFLAG "r"
int main(void)
{
FILE *out, *in;
int i;
char buf[100];
out = fopen(FILENAME, WRITEFLAG);
for (i=0; i<sizeof(buf); ++i)
buf[i] = (char)i;
fwrite(buf, 1, sizeof(buf), out);
fclose(out);
/* ... */
in = fopen(FILENAME, READFLAG);
fread(buf, 1, sizeof(buf), in);
for (i=0; i<sizeof(buf); ++i)
printf("%02x", buf[i]);
fclose(in);
return 0;
}
> Il punto qual'è? Che se WRITEFLAG come "wb" o "wt" o "w" (e parallelamente la
> READFLAG) il programma cambia behaviour?
>
> Non credo proprio.
Dunque, se utilizzi lo stesso formato (text o binary) sia per leggere che per
scrivere, e scrittura e lettura avvengono su architetture compatibili
il risultato viene identico (e ci mancherebbe anche...)
Se usi formati diversi, ad esempio scrivi testo e leggi binario, rischi di
avere risultati diversi, ad esempio, se esegui il programma su windows
ottieni due stampe diverse perche' la fwrite su uno sstream di testo su
windows sostituisce ogni \n con una coppia \r\n cosa che non avviene se
lo stream e' binario:
wt + rb
000102030405060708090d0a0b0c0d...
wb + rb
000102030405060708090a0b0c0d0e...
wt + rt
000102030405060708090a0b0c0d0e...
Come vedi la fwrite su uno stream di testo scrive un byte in piu' che la
lettura in binario evidenzia MA la lettura in testo invece NO perche'
effettua la conversione al contrario: ogni volta che trova \r\n converte
in un unico \n
Su sistemi Unix questo non si vedrebbe perche' la norma e' di usare \n come
carattere di andata a capo quindi la conversione di fatto non fa nulla.
Sui sistemi Mac dove si usa '\r' lo vedresti di nuovo ma non con un byte
in piu' ma con un byte diverso.
La situazione si complica ulteriormente quando trasferisci file tra architetture
diverse: se prendi un file di testo da windows e lo porti su unix, ti compaiono
dei caratteri in piu' in pratica raddoppiandoti le andate a capo
(questo avveniva in passato, al giorno d'oggi penso sia standard che la libreria
quando legge uno stream in modalita' testo e' in grado di capire che tipo di
andata a capo e' stata usata e si adegua in modo piu' intelligente)
ciao
Giacomo