Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

File leggibile con fwrite()

26 views
Skip to first unread message

NERO23

unread,
Apr 17, 2013, 1:23:20 PM4/17/13
to
Mi sto esercitando con la funzione fwrite() e mi chiedevo perchᅵ, i
due esempi riportati sotto, si comportano in modo differente.

Il file .txt creato con il primo esempio non ᅵ comprensibile mentre
lo ᅵ con il secondo.

Essendo entrambi file binari, non dovrebbere essere entrambi
incomprensibili se aperti con notepad?

Grazie


// PRIMO ESEMPIO:

//IL FILE CREATO E' INCOMPRENSIBILE
FILE *fp;
int vet[10] = {1,2,3,4,5,6,7,8,9,10};
if ((fp = fopen("numeri.txt","wb"))==NULL)
exit(1);
fwrite(vet, sizeof(int), 10, fp);
fclose(fp);





// SECONDO ESEMPIO:

// IL FILE CREATO E' LEGGIBILE
FILE *fp2;
int n2;
char msg[4] = "TESTO";
if ((fp2 = fopen("testo.txt","wb"))==NULL)
exit(1);
fwrite(msg, 6, 1, fp2);
fclose(fp2);

Manlio Perillo

unread,
Apr 17, 2013, 1:33:31 PM4/17/13
to
Il Wed, 17 Apr 2013 19:23:20 +0200, NERO23 ha scritto:

> Mi sto esercitando con la funzione fwrite() e mi chiedevo perchè, i due
> esempi riportati sotto, si comportano in modo differente.
>
> Il file .txt creato con il primo esempio non è comprensibile mentre lo è
> con il secondo.
>
> Essendo entrambi file binari, non dovrebbere essere entrambi
> incomprensibili se aperti con notepad?
>

Non hai le idee chiare sulla differenza tra file di testo e file binario.
Dovrebbe essere spiegato in qualsiasi testo decente.

> [...]


Ciao Manlio

NERO23

unread,
Apr 17, 2013, 1:39:56 PM4/17/13
to

> Non hai le idee chiare sulla differenza tra file di testo e file binario.
> Dovrebbe essere spiegato in qualsiasi testo decente.

Conosco la differenza (almeno credo :) ).

In entrambi gli esempi, il file viene creato in modalitᅵ binaria (wb) e
quindi mi aspetto di trovare i dati in modalitᅵ binaria e non ascii...


ciao

fma...@gmail.com

unread,
Apr 17, 2013, 1:52:24 PM4/17/13
to
On Wednesday, April 17, 2013 7:39:56 PM UTC+2, NERO23 wrote:
> > Non hai le idee chiare sulla differenza tra file di testo e file binario.
> > Dovrebbe essere spiegato in qualsiasi testo decente.
>
> Conosco la differenza (almeno credo :) ).
>
> In entrambi gli esempi, il file viene creato in modalità binaria (wb) e
> quindi mi aspetto di trovare i dati in modalità binaria e non ascii...
>

In entrambi i casi viene scritta sul file la rappresentazione binaria del
dato che ci metti: nel secondo caso (mi si perdoni il linguaggio sbagliato,
è per far capire) il binario del codice ASCII di ogni carattere, nel primo
caso il binario dei 2,4o8 bytes di ogni intero.
Il fatto è che il "notepad" capisce e traduce solo i codici ASCII: quindi
nel secondo caso passa byte a byte e mette i caratteri, e nel primo caso pure
(solo che non trova caratteri ASCII!)

Ciao!

Manlio Perillo

unread,
Apr 17, 2013, 1:55:11 PM4/17/13
to
Il Wed, 17 Apr 2013 19:39:56 +0200, NERO23 ha scritto:

>> Non hai le idee chiare sulla differenza tra file di testo e file
>> binario. Dovrebbe essere spiegato in qualsiasi testo decente.
>
> Conosco la differenza (almeno credo :) ).
>
> In entrambi gli esempi, il file viene creato in modalità binaria (wb) e
> quindi mi aspetto di trovare i dati in modalità binaria e non ascii...
>

Credi male, direi...

Dovresti trovare le informazioni che ti servono su Wikipedia, o tramite
una semplice ricerca su Google.

Per farla semplice, quando apri un file in modalità testuale,
l'implementazione applica delle trasformazioni dalla rappresentazione
interna (quello che nel programma) a quella esterna (quello che è
presente nel file).

La trasformazione più semplice è ad esempio quella del carattere di fine
riga. Prova ad creare un file con Notepad, e poi a leggerlo tramite un
programma scritto in C, sia in modalità binaria che testuale.
Vedrai che in modalità testuale nel buffer che leggi non sarà presente il
carattere '\r'. Tieni conto che però questo dipende dall'implementazione.

Un altra trasformazione riguarda l'encoding/decoding del testo, ma questo
è più complesso.



Ciao Manlio

NERO23

unread,
Apr 17, 2013, 1:56:08 PM4/17/13
to

> In entrambi i casi viene scritta sul file la rappresentazione binaria del
> dato che ci metti: nel secondo caso (mi si perdoni il linguaggio sbagliato,
> ᅵ per far capire) il binario del codice ASCII di ogni carattere, nel primo
> caso il binario dei 2,4o8 bytes di ogni intero.
> Il fatto ᅵ che il "notepad" capisce e traduce solo i codici ASCII: quindi
> nel secondo caso passa byte a byte e mette i caratteri, e nel primo caso pure
> (solo che non trova caratteri ASCII!)


Ok, ora ᅵ tutto chiaro.
Ciao

Manlio Perillo

unread,
Apr 17, 2013, 3:01:46 PM4/17/13
to
Il Wed, 17 Apr 2013 19:56:08 +0200, NERO23 ha scritto:

>> In entrambi i casi viene scritta sul file la rappresentazione binaria
>> del dato che ci metti: nel secondo caso (mi si perdoni il linguaggio
>> sbagliato, è per far capire) il binario del codice ASCII di ogni
>> carattere, nel primo caso il binario dei 2,4o8 bytes di ogni intero. Il
>> fatto è che il "notepad" capisce e traduce solo i codici ASCII: quindi
>> nel secondo caso passa byte a byte e mette i caratteri, e nel primo
>> caso pure (solo che non trova caratteri ASCII!)
>
>
> Ok, ora è tutto chiaro.
> Ciao

Questa è la tabella dei codici ASCII:
http://en.wikipedia.org/wiki/ASCII

Vedi in particolare i codici per i caratteri di controllo, e quelli per i
caratteri stampabili.


Studiando quella tabella, cosa ti aspetti che scriva il seguente codice?

#include <stdlib.h>
#include <stdio.h>


int main()
{
unsigned v[1] = {0x2173706fU};
FILE *fp;

fp = fopen("numero.txt", "wb");
if (fp == NULL) {
perror("fopen() failed");

return EXIT_FAILURE;
}

fwrite(v, sizeof(unsigned), 1, fp);
fclose(fp);

return EXIT_SUCCESS;
}


Ciao Manlio

neonano

unread,
Apr 17, 2013, 3:04:56 PM4/17/13
to
Addì mercoledì 17 aprile 2013 19:23 NERO23 scrisse:

> Essendo entrambi file binari, non dovrebbere essere entrambi
> incomprensibili se aperti con notepad?

Dipende. Se scrivi stupidaggini e farneticazioni allora tutti i tuoi file
saranno incomprensibili.

Comunque io non vedo nulla di strano o insolito


[neo lavoro]$ cat testo.txt
TESTO[neo lavoro]$ hexdump -C testo.txt
00000000 54 45 53 54 4f 00 |TESTO.|
00000006
[neo lavoro]$ cat numeri.txt

[neo lavoro]$ hexdump -C numeri.txt
00000000 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 |................|
00000010 05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 00 |................|
00000020 09 00 00 00 0a 00 00 00 |........|
00000028
[neo lavoro]$ od -a numeri.txt
0000000 soh nul nul nul stx nul nul nul etx nul nul nul eot nul nul nul
0000020 enq nul nul nul ack nul nul nul bel nul nul nul bs nul nul nul
0000040 ht nul nul nul nl nul nul nul
0000050
[neo lavoro]$



Addì mercoledì 17 aprile 2013 19:23 NERO23 scrisse:

> char msg[4] = "TESTO";

Almeno sei

neonano

unread,
Apr 17, 2013, 3:10:27 PM4/17/13
to
Addì mercoledì 17 aprile 2013 19:33 Manlio Perillo scrisse:

> Non hai le idee chiare sulla differenza tra file di testo e file binario.
> Dovrebbe essere spiegato in qualsiasi testo decente.

Neanche tu. A parte le giuste osservazioni del buon Massei, nei
compilatori recenti, gcc per primo, i file vengono aperti sempre
in modo binario, non c'è differenza tra "b" e "t" e quest'ultima è
rimasta solo per compatibilità.


Manlio Perillo

unread,
Apr 17, 2013, 3:52:21 PM4/17/13
to
"t" non esiste.

Inoltre MSVC è un compilatore recente (anche se non implementa C99) e
**c'è** differenza tra modalità testo e binaria.

Nel dubbio, su cosa si intenda per stream in modalità testo o binaria, fa
testo lo standard, non di certo una o più implementazioni del linguaggio.

Comunque, su sistemi UNIX, non c'è *mai* stata differenza tra modalità
testo e binaria. Lo standard per il C ha aggiunto il supporto per la
modalità testo in modo da poter definire in modo univoco cosa è una linea
(zero o più caratteri separati dal carattere '\n'), e al tempo stesso
essere compatibile con sistemi che usano convenzioni diverse (come
Windows), permettendo all'implementazione di tradurre tra la convenzione
usata dal C e quella usata dal sistema host.


Ciao Manlio

neonano

unread,
Apr 17, 2013, 5:03:29 PM4/17/13
to
Addì mercoledì 17 aprile 2013 21:52 Manlio Perillo scrisse:

> Inoltre MSVC è un compilatore recente (anche se non implementa C99) e
> **c'è** differenza tra modalità testo e binaria.

C'è stata un'altra discussione su questo e no, non c'è differenza tra modo
testo e modo binario ma come stanno esattamente le cose dipende dal
particolare compilatore.

Ok mi informo.

fma...@gmail.com

unread,
Apr 17, 2013, 5:12:44 PM4/17/13
to
On Wednesday, April 17, 2013 9:52:21 PM UTC+2, Manlio Perillo wrote:
>
> "t" non esiste.
>

Sì, nello standard non c'è.

> Inoltre MSVC è un compilatore recente (anche se non implementa C99) e
> **c'è** differenza tra modalità testo e binaria.
>
> Nel dubbio, su cosa si intenda per stream in modalità testo o binaria, fa
> testo lo standard, non di certo una o più implementazioni del linguaggio.
>
> Comunque, su sistemi UNIX, non c'è *mai* stata differenza tra modalità
> testo e binaria. Lo standard per il C ha aggiunto il supporto per la
> modalità testo in modo da poter definire in modo univoco cosa è una linea
> (zero o più caratteri separati dal carattere '\n'), e al tempo stesso
> essere compatibile con sistemi che usano convenzioni diverse (come
> Windows), permettendo all'implementazione di tradurre tra la convenzione
> usata dal C e quella usata dal sistema host.
>

Eh, non è così semplice...
Non troppo tempo fa ne abbiamo parlato in un thread abbastanza lungo, dove
sono stati anche citati i vari passi dello standard, il comportamento di
vari compilatori in vari sistemi - se cerchi lo trovi sicuramente.

Ciao!

Manlio Perillo

unread,
Apr 17, 2013, 5:18:57 PM4/17/13
to
Dipende dal sistema operativo.
Su Windows, questo programma produce due files diversi, a seconda se il
file è aperto in modalità testo o binaria:


#include <stdlib.h>
#include <stdio.h>

int main()
{
FILE *fp;

fp = fopen("test.txt", "wb");
if (fp == NULL) {
perror("fopen() failed");

return EXIT_FAILURE;
}

fputs("hello\n", fp);
fputs("world\n", fp);

fclose(fp);

return EXIT_SUCCESS;
}


Provato con Visual Studio, ma anche Mingw e qualsiasi compilatore per
Windows dovrebbe produrre lo stesso risultato.

In modalità binaria, il carattere '\n' viene scritto così come è nel file.
In modalità testo, viene convertito in \r\n.


Sbagliavo, invece, riguardo l'encoding.
Ho fatto dei test su Linux con GCC, ed il testo viene decodificato anche
se il file è aperto in modalità binaria, se uso ad esempio fgetws.


Ciao Manlio

fma...@gmail.com

unread,
Apr 18, 2013, 12:50:08 AM4/18/13
to
On Wednesday, April 17, 2013 11:18:57 PM UTC+2, Manlio Perillo wrote:
> Il Wed, 17 Apr 2013 23:03:29 +0200, neonano ha scritto:
>
> > Addì mercoledì 17 aprile 2013 21:52 Manlio Perillo scrisse:
>
> >> Inoltre MSVC è un compilatore recente (anche se non implementa C99) e
> >> **c'è** differenza tra modalità testo e binaria.
>
> > C'è stata un'altra discussione su questo e no, non c'è differenza tra
> > modo testo e modo binario ma come stanno esattamente le cose dipende dal
> > particolare compilatore.
> >
>
>
> In modalità binaria, il carattere '\n' viene scritto così come è nel file.
> In modalità testo, viene convertito in \r\n.
>
> Sbagliavo, invece, riguardo l'encoding.
> Ho fatto dei test su Linux con GCC, ed il testo viene decodificato anche
> se il file è aperto in modalità binaria, se uso ad esempio fgetws.
>


Il thread si chiama "curiosità da newbie su EOF", passo il link di uno dei
miei ultimi commenti, ma tutto il thread vale la pena.
https://groups.google.com/d/msg/it.comp.lang.c/dgFcPqS6U84/q1AAMdmSW2IJ

Ciao!

Manlio Perillo

unread,
Apr 18, 2013, 4:41:54 AM4/18/13
to
Il Wed, 17 Apr 2013 14:12:44 -0700, fmassei ha scritto:

> [...]
>> Comunque, su sistemi UNIX, non c'è *mai* stata differenza tra modalità
>> testo e binaria. Lo standard per il C ha aggiunto il supporto per la
>> modalità testo in modo da poter definire in modo univoco cosa è una
>> linea (zero o più caratteri separati dal carattere '\n'), e al tempo
>> stesso essere compatibile con sistemi che usano convenzioni diverse
>> (come Windows), permettendo all'implementazione di tradurre tra la
>> convenzione usata dal C e quella usata dal sistema host.
>>
>>
> Eh, non è così semplice...

Ma grosso modo è quanto dice lo standard.

> Non troppo tempo fa ne abbiamo parlato in un thread abbastanza lungo,
> dove sono stati anche citati i vari passi dello standard, il
> comportamento di vari compilatori in vari sistemi - se cerchi lo trovi
> sicuramente.
>

Letto, ma mi lascia dubbioso il fatto che text-stream == terminale e non
file fisico.

Input and output, whether to or from physical devices such as terminals
and tape drivers, or whether to or from files supported on sttuctured
storage devices, are mapped into logical data streams <...>. Two forms of
mapping are supported, for text streams and for binary streams.

In seguito poi spiega la differenza fra text e binary streams, ed in
quali condizioni un programma ha la garanzia che quanto ha scritto in uno
stream e quanto viene riletto in seguito risulta uguale.

Infine, che intendi con file di testo associato a stream binario?


> [...]


Ciao Manlio

fma...@gmail.com

unread,
Apr 18, 2013, 5:02:52 AM4/18/13
to
On Thursday, April 18, 2013 10:41:54 AM UTC+2, Manlio Perillo wrote:
>
> [CUT]
>
> Infine, che intendi con file di testo associato a stream binario?
>

Significa che, per lo standard, ci sono due tipi di stream (testo e binario)
e due tipi di file (testo e binario); un file è associato ad uno stream, per
cui puoi avere quattro combinazioni possibili.
Se la situazione non è binario-binario allora è implementation defined.

Ciao!

Manlio Perillo

unread,
Apr 18, 2013, 5:29:03 AM4/18/13
to
Non riesco a trovare nessun riferimento a questo, nello standard.


Ciao Manlio

fma...@gmail.com

unread,
Apr 18, 2013, 5:38:14 AM4/18/13
to
Infatti non è scritto esplicitamente da nessuna parte. Se inizi a fare un
po' di considerazioni sui vari punti, però, probabilmente arrivi a questa
conclusione.

Ciao!

Manlio Perillo

unread,
Apr 18, 2013, 5:56:24 AM4/18/13
to
Il Thu, 18 Apr 2013 02:38:14 -0700, fmassei ha scritto:

> On Thursday, April 18, 2013 11:29:03 AM UTC+2, Manlio Perillo wrote:
>> Il Thu, 18 Apr 2013 02:02:52 -0700, fmassei ha scritto:
>>
>> > On Thursday, April 18, 2013 10:41:54 AM UTC+2, Manlio Perillo wrote:
>>
>> >> Infine, che intendi con file di testo associato a stream binario?
>>
>> > Significa che, per lo standard, ci sono due tipi di stream (testo e
>> > binario) e due tipi di file (testo e binario); un file è associato ad
>> > uno stream, per cui puoi avere quattro combinazioni possibili. Se la
>> > situazione non è binario-binario allora è implementation defined.
>>
>> Non riesco a trovare nessun riferimento a questo, nello standard.
>>
>>
> Infatti non è scritto esplicitamente da nessuna parte.

Si, dopo aver inviato il messaggio ho capito cosa intendevi.
Ma è una semplice conseguenza di quanto descritto chiaramente dallo
standard; non c'è nessuna sorpresa.

Se ad esempio l'implementazione, per stream in modalità testo, effettua
delle trasformazioni per gestire il carattere di fine riga, è ovvio che
se scrivi due righe in un file aperto in modalità testo, e poi rileggi
tramite un file aperto in modalità binaria, quello che leggi dipende
dall'implementazione.

> [...]


Ciao Manlio
0 new messages