2010-02-01 15 views
46

Ho provato a usare fopen in C, il secondo parametro è la modalità aperta. Le due modalità "r" e "rb" tendono a confondermi molto. Sembra che siano uguali. Ma a volte è meglio usare "rb". Quindi, perché esiste "r"? Spiegatemi dettagliatamente o con esempi. Grazie.quali sono le differenze tra r e rb in fopen

+0

Leggere e leggere binario http://c-faq.com/stdio/textvsbinary.html – Terrance

risposta

59

È necessario utilizzare "r" per aprire file di testo. Diversi sistemi operativi hanno modi leggermente diversi di memorizzare il testo, e questo eseguirà le traduzioni corrette in modo che non sia necessario conoscere le idiosincrasie del sistema operativo locale. Ad esempio, saprai che i newline appariranno sempre come un semplice "\n", indipendentemente da dove viene eseguito il codice.

È necessario utilizzare "rb" se si stanno aprendo file non di testo, perché in questo caso le traduzioni non sono appropriate.

+2

Questo dipende dalla piattaforma. Su Unix, la modalità testo non fa nulla di speciale, quindi non gestirà ancora '\ r \ n' come' \ n'. –

+0

L'idea è che '" r "' aprirà correttamente un "file di testo" sullo stesso sistema. Se stai aprendo un file di testo di Windows su Linux con '" r "', devi prenderti cura delle diverse convenzioni di fine linea, naturalmente. –

+0

Se apri un file scritto in Windows su un sistema Linux, vedrai il comportamento. È necessario convertire il file in un file di testo Unix. Puoi farlo facilmente con un programma chiamato 'dos2unix', o in vim, dopo aver aperto un file, scrivi,:: se ff = unix', premi return, e poi salva. –

6

utilizzare "rb" per aprire un file binario. Poi i byte del file non sarà codificato quando si leggono le

6
  • "r" è lo stesso di "rt" per Translated mode
  • "rb" è modalità non tradotta.

Questo fa la differenza su Windows, almeno. Vedi quel link per i dettagli.

+2

'" rt "' non è standard. –

23

Su Linux e Unix in generale, "r" e "rb" sono gli stessi. Più in particolare, un puntatore FILE ottenuto da fopen() in un file in modalità testo e in modalità binaria si comporta allo stesso modo su Unix. Su Windows e, in generale, su sistemi che utilizzano più di un carattere per rappresentare "newlines", un file aperto in modalità testo si comporta come se tutti quei caratteri fossero solo un carattere, '\n'.

Se si desidera leggere leggere/scrivere file di testo su qualsiasi sistema, utilizzare "r" e "w" in fopen(). Ciò garantirà che i file siano scritti e letti correttamente. Se si sta aprendo un file binario, utilizzare "rb" e "wb", in modo che una sfortunata traduzione di nuova riga non comprometta i dati.

Si noti che una conseguenza del sistema sottostante che esegue la traduzione di nuova riga è che non è possibile determinare il numero di byte che è possibile leggere da un file utilizzando fseek(file, 0, SEEK_END).

Infine, vedere What's the difference between text and binary I/O? su comp.lang.c FAQs.

1

Sulla maggior parte dei sistemi POSIX, viene ignorato. Ma controlla il tuo sistema per essere sicuro.

XNU

La stringa modalità può anche includere la lettera 'b' sia come ultimo carattere o come un carattere tra i caratteri in una qualsiasi delle stringhe di due caratteri sopra descritti. Questo è strettamente compatibile con ISO/IEC 9899: 1990 ('ISO C90') e non ha alcun effetto; la 'b' è ignorata.

Linux stringa

La modalità può anche includere la lettera 'b' o come ultima carattere o come un personaggio tra i personaggi in una qualsiasi delle a due stringhe di caratteri sopra descritti. È strettamente compatibile con la compatibilità con C89 e non ha alcun effetto; la 'b' viene ignorata su tutti i sistemi conformi a POSIX, incluso Linux. (Gli altri sistemi potrebbero trattare i file di testo e i file binari in modo diverso e aggiungere la "b" potrebbe essere una buona idea se si esegue l'I/O su un file binario e si aspetta che il proprio programma possa essere portato su ambienti non UNIX.

Problemi correlati