Differenza tra i file scritti in modalità binaria e testuale

Quale traduzione si verifica quando si scrive su un file che è stato aperto in modalità testo che non si verifica in modalità binaria? Specificamente in MS Visual C.

unsigned char buffer[256]; for (int i = 0; i < 256; i++) buffer[i]=i; int size = 1; int count = 256; 

Modalità binaria:

 FILE *fp_binary = fopen(filename, "wb"); fwrite(buffer, size, count, fp_binary); 

Versus modalità testo:

 FILE *fp_text = fopen(filename, "wt"); fwrite(buffer, size, count, fp_text); 

Credo che molte piattaforms ignorino l’opzione “t” o l’opzione “text-mode” quando si gestiscono gli stream. Su Windows, tuttavia, questo non è il caso. Se date un’occhiata alla descrizione della funzione fopen () su: MSDN , vedrete che specificando l’opzione “t” avrà il seguente effetto:

  • i feed di riga (‘\ n’) verranno convertiti in sequenze \ r \ n “in uscita
  • le sequenze di ritorno a capo / avanzamento riga verranno convertite in feed di riga in ingresso.
  • Se il file viene aperto in modalità append, la fine del file verrà esaminata per un carattere ctrl-z (carattere 26) e tale carattere rimosso, se ansible. Inoltre interpreterà la presenza di quel personaggio come la fine del file. Questo è uno sfortunato residuo dei giorni del CPM (qualcosa sui peccati dei genitori visitati sui loro figli fino alla 3a o 4a generazione). Contrariamente a quanto affermato in precedenza, il carattere ctrl-z non verrà aggiunto.

In modalità testo, una nuova riga “\ n” può essere convertita in un ritorno a capo + a capo “\ r \ n”

Di solito ti consigliamo di aprire in modalità binaria. Cercare di leggere qualsiasi dato binario in modalità testo non funzionerà, sarà danneggiato. Puoi leggere il testo ok in modalità binaria, ma non eseguirà le traduzioni automatiche da “\ n” a “\ r \ n”.

Vedi fopen

Inoltre, quando si finge un file con “rt”, l’input viene terminato su un carattere Crtl-Z.

Un’altra differenza è quando si utilizza fseek

Se il stream è aperto in modalità binaria, la nuova posizione è esattamente offset byte misurati dall’inizio del file se l’origine è SEEK_SET, dalla posizione del file corrente se l’origine è SEEK_CUR e dalla fine del file se l’origine è SEEK_END. Alcuni flussi binari potrebbero non supportare SEEK_END.

Se il stream è aperto in modalità testo, gli unici valori supportati per l’offset sono zero (che funziona con qualsiasi origine) e un valore restituito da una chiamata precedente a std :: ftell su un stream associato allo stesso file (che funziona solo con origine di SEEK_SET.

Abbiamo avuto un problema interessante con l’apertura di file in modalità testo in cui i file avevano una combinazione di caratteri di fine riga:

 1\n\r 2\n\r 3\n 4\n\r 5\n\r 

Il nostro requisito è che possiamo memorizzare la nostra posizione corrente nel file (abbiamo usato fgetpos), chiudere il file e poi riaprire il file e cercare quella posizione (abbiamo usato fsetpos).

Tuttavia, se un file contiene miscele di terminazioni di riga, questo processo non è riuscito a cercare la stessa posizione effettiva. Nel nostro caso (il nostro strumento analizza il C ++), stavamo rileggendo parti del file che avevamo già visto.

Vai con binario – quindi puoi controllare esattamente ciò che viene letto e scritto dal file.