Quais são as diferenças entre r e rb em fopen

Eu tentei usar fopen em C, o segundo parâmetro é o modo aberto. Os dois modos “r” e “rb” tendem a me confundir muito. Parece que eles são iguais. Mas às vezes é melhor usar “rb”. Então, por que “r” existe? Explique-me em detalhes ou com exemplos. Obrigado.

Você deve usar "r" para abrir arquivos de texto. Diferentes sistemas operacionais têm maneiras ligeiramente diferentes de armazenar texto, e isso executará as traduções corretas para que você não precise saber sobre as idiossincrasias do sistema operacional local. Por exemplo, você saberá que as novas linhas sempre aparecerão como um simples "\n" , independentemente de onde o código é executado.

Você deve usar "rb" se estiver abrindo arquivos que não sejam de texto, porque, nesse caso, as traduções não são apropriadas.

No Linux e no Unix em geral, "r" e "rb" são os mesmos. Mais especificamente, um ponteiro FILE obtido por fopen() um arquivo no modo de texto e no modo binário se comporta da mesma maneira em Unixes. No Windows e, em geral, em sistemas que usam mais de um caractere para representar ” novas linhas “, um arquivo aberto no modo de texto se comporta como se todos esses caracteres fossem apenas um caractere, '\n' .

Se você quiser portável ler / gravar arquivos de texto em qualquer sistema, use "r" e "w" em fopen() . Isso garantirá que os arquivos sejam gravados e lidos corretamente. Se você estiver abrindo um arquivo binário, use "rb" e "wb" , para que uma infeliz tradução de nova linha não atrapalhe seus dados.

Observe que uma consequência do sistema subjacente que faz a nova tradução para você é que você não pode determinar o número de bytes que você pode ler de um arquivo usando o fseek (arquivo, 0, SEEK_END) .

Finalmente, veja Qual é a diferença entre o texto e a E / S binária? em comp.lang.c FAQs .

use “rb” para abrir um arquivo binário. Então os bytes do arquivo não serão codificados quando você os ler

  • “r” é o mesmo que “rt” para o modo Traduzido
  • “rb” é o modo não traduzido.

Isso faz diferença no Windows, pelo menos. Veja esse link para detalhes.

Na maioria dos sistemas POSIX, ele é ignorado. Mas verifique seu sistema para ter certeza.

XNU

A string de modo também pode include a letra ‘b’ como último caractere ou como caractere entre os caracteres em qualquer uma das strings de dois caracteres descritas acima. Isto é estritamente para compatibilidade com ISO / IEC 9899: 1990 (‘ISO C90’) e não tem efeito; o ‘b’ é ignorado.

Linux

A string mode também pode include a letra ‘b’ como último caractere ou como caractere entre os caracteres em qualquer uma das strings de dois caracteres descritas acima. Isto é estritamente para compatibilidade com C89 e não tem efeito; o ‘b’ é ignorado em todos os sistemas de conformidade POSIX, incluindo o Linux. (Outros sistemas podem tratar arquivos de texto e binários de maneira diferente, e adicionar o ‘b’ pode ser uma boa idéia se você fizer E / S em um arquivo binário e esperar que seu programa possa ser portado para ambientes não-UNIX.)