2010-02-01 17 views
46

He intentado usar fopen en C, el segundo parámetro es el modo abierto. Los dos modos "r" y "rb" tienden a confundirme mucho. Parece que son lo mismo. Pero a veces es mejor usar "rb". Entonces, ¿por qué existe "r"? Explícamelo en detalle o con ejemplos. Gracias.¿cuál es la diferencia entre r y rb en fopen

+0

Lectura y lectura en binario http://c-faq.com/stdio/textvsbinary.html – Terrance

Respuesta

59

Debe usar "r" para abrir archivos de texto. Los diferentes sistemas operativos tienen formas ligeramente diferentes de almacenar texto, y esto llevará a cabo las traducciones correctas para que no necesite conocer las idiosincrasias del sistema operativo local. Por ejemplo, sabrá que las nuevas líneas siempre aparecerán como un simple "\n", independientemente de dónde se ejecute el código.

Debe usar "rb" si está abriendo archivos que no son de texto, porque en este caso las traducciones no son apropiadas.

+2

Esto depende de la plataforma. En Unix, el modo de texto no hace nada especial, por lo que aún no manejará '\ r \ n' como' \ n'. –

+0

La idea es que '" r "' abrirá correctamente un "archivo de texto" en el mismo sistema. Si está abriendo un archivo de texto de Windows en Linux con '" r "', usted mismo tiene que encargarse de las diferentes convenciones de terminación de línea, por supuesto. –

+0

Si abre un archivo escrito en Windows en un sistema Linux, verá el comportamiento. Necesita convertir el archivo a un archivo de texto de Unix. Puede hacerlo fácilmente con un programa llamado 'dos2unix', o en vim, después de abrir un archivo, escriba,': se ff = unix', pulse return, y luego guárdelo. –

6

utilice "rb" para abrir un archivo binario. A continuación, los bytes del archivo no será codificado cuando se lee ellas

6

Esto hace una diferencia en Windows, al menos. Ver ese enlace para más detalles.

+2

'" rt "' no es estándar. –

23

En Linux y Unix en general, "r" y "rb" son los mismos. Más específicamente, un puntero FILE obtenido por fopen() ing en un archivo en modo texto y en modo binario se comporta de la misma manera en Unixes. En Windows, y en general, en sistemas que usan más de un carácter para representar "newlines", un archivo abierto en modo texto se comporta como si todos esos caracteres fueran solo un carácter, '\n'.

Si desea leer o escribir archivos de texto en cualquier sistema, use "r" y "w" en fopen(). Eso garantizará que los archivos estén escritos y leídos correctamente. Si está abriendo un archivo binario, use "rb" y "wb", de modo que una desafortunada traducción de línea nueva no altere sus datos.

Tenga en cuenta que una consecuencia del sistema subyacente que le realiza la nueva traducción es que no puede determinar la cantidad de bytes que puede leer desde un archivo usando fseek(file, 0, SEEK_END).

Finalmente, vea What's the difference between text and binary I/O? en comp.lang.c FAQs.

1

En la mayoría de los sistemas POSIX, se ignora. Pero, verifique su sistema para estar seguro.

XNU

La cadena modo también puede incluir la letra 'b' sea como último carácter o como un personaje entre los personajes en cualquiera de las cadenas de dos caracteres descritos anteriormente. Esto es estrictamente compatible con ISO/IEC 9899: 1990 ('ISO C90') y no tiene ningún efecto; la 'b' es ignorada.

Linux cadena

El modo también puede incluir la letra 'b', ya sea como último carácter o como un personaje entre los personajes en cualquiera de las cadenas de caracteres de dos descritos anteriormente. Esto es estrictamente para la compatibilidad con C89 y no tiene ningún efecto; la 'b' se ignora en todos los sistemas conformes a POSIX , incluido Linux. (Otros sistemas pueden tratar archivos de texto y archivos binarios de forma diferente, y agregar la 'b' puede ser una buena idea si realiza E/S en un archivo binario y espera que su programa se transmita a entornos que no sean UNIX.)

Cuestiones relacionadas