Newsgroup: it.comp.lang.c
Titolo: File leggibile con  fwrite()

  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);

 [...]
 
 
Ciao  Manlio

 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

 
 
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!

 
 
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

 (solo che non trova caratteri ASCII!)
 
 
Ok, ora ï¿œ tutto chiaro.
Ciao

 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

      char msg[4] = "TESTO";
 
Almeno sei

 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à.
 
 


"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

 **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.

 
 
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!


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

 
 
 
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!

 [...]
 
 
Ciao  Manlio

 
 
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!


Non riesco a trovare nessun riferimento a questo, nello standard.
 
 
Ciao  Manlio


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!

 [...]
 
 
Ciao  Manlio