Che cosa significa che il flag di binario IO del file è rilevante solo su Windows

4

Stavo leggendo una domanda e uno dei commenti ha indicato che "Il flag binario è rilevante solo su Windows". Dato il contesto della domanda e della risposta, interpreto questa affermazione come on non-windows machines, we don't need to specify text or binary mode when doing file IO

Il contesto della domanda è di leggere tutti i byte di un file in una stringa (presumibilmente preservando i byte). Mi sembra molto importante sapere se sto leggendo i dati come testo o byte, dato che la lettura del testo riguarda la codifica. Ad esempio, se sto leggendo un file UTF-16, quello che ottengo in modalità testo è molto diverso da quello che ottengo in modalità binaria.

Supponendo che la mia interpretazione dell'istruzione sia corretta, non è necessario specificare se un file debba essere aperto in modalità testo o binario su macchine non Windows? Cioè, tutti i file vengono letti in modalità binaria per impostazione predefinita.

Altrimenti, a cosa potrebbe riferirsi la dichiarazione? (il commento ha ricevuto un certo numero di upvotes quindi presumibilmente questa non è solo l'opinione di una persona)

    
posta That Umbrella Guy 13.05.2014 - 22:46
fonte

1 risposta

6

Il flag "binario" esiste per la chiamata della funzione fopen() nella libreria standard C. Sul mio sistema Linux più vicino, la documentazione afferma:

The mode string can also include the letter 'b' either as a last character or as a character between the characters in any of the two-character strings described above. This is strictly for compatibility with C89 and has no effect; the 'b' is ignored on all POSIX conforming systems, including Linux. (Other systems may treat text files and binary files differently, and adding the 'b' may be a good idea if you do I/O to a binary file and expect that your program may be ported to non-Unix environments.)

Le funzioni della libreria standard C non si occupano delle codifiche di testo. I dati letti o scritti su file sono byte. Su alcuni sistemi come Windows, le terminazioni di linea sono convenzionalmente \r\n ma su sistemi POSIX, le terminazioni di riga sono solo \n . Questa è una delle cose che controlla il flag "binario" (un'altra cosa potrebbe essere il dettaglio della gestione di fine file).

Tuttavia, in Ruby, IO :: new function tratta il flag "b" come segue (enfasi mia):

"b" Binary file mode
Suppresses EOL <-> CRLF conversion on Windows. And sets external encoding to ASCII-8BIT unless explicitly specified.

Ciò significa che, in aggiunta, Ruby imposta la codifica dei caratteri a seconda che il flag "b" sia incluso. Ciò significa che il suo utilizzo è non specifico per Windows e può influenzare il comportamento del tuo programma anche su un sistema POSIX.

    
risposta data 13.05.2014 - 23:07
fonte

Leggi altre domande sui tag