web-dev-qa-db-fra.com

quelles sont les différences entre r et rb dans fopen

J'ai essayé d'utiliser fopen en C, le deuxième paramètre est le mode ouvert. Les deux modes "r" et "rb" ont tendance à me dérouter beaucoup. Il semble qu'ils soient identiques. Mais parfois, il vaut mieux utiliser "rb". Alors, pourquoi "r" existe-t-il? Expliquez-le-moi en détail ou avec des exemples. Je vous remercie.

54
Shaobo Wang

Tu devrais utiliser "r" pour ouvrir les fichiers texte. Différents systèmes d'exploitation ont des manières légèrement différentes de stocker du texte, et cela effectuera les traductions correctes afin que vous n'ayez pas besoin de connaître les particularités du système d'exploitation local. Par exemple, vous saurez que les sauts de ligne apparaîtront toujours sous la forme d'un simple "\n", quel que soit l'emplacement d'exécution du code.

Tu devrais utiliser "rb" si vous ouvrez des fichiers non textuels, car dans ce cas, les traductions ne sont pas appropriées.

68
caf

Sous Linux et Unix en général, "r" Et "rb" Sont les mêmes. Plus précisément, un pointeur FILE obtenu par fopen() ing un fichier en mode texte et en mode binaire se comporte de la même manière sous Unix. Sur les fenêtres, et en général, sur les systèmes qui utilisent plus d'un caractère pour représenter " newlines ", un fichier ouvert en mode texte se comporte comme si tous ces caractères n'étaient qu'un seul caractère, '\n'.

Si vous souhaitez lire/écrire des fichiers texte sur n'importe quel système, utilisez "r" Et "w" Dans fopen(). Cela garantira que les fichiers sont écrits et lus correctement. Si vous ouvrez un fichier binaire, utilisez "rb" Et "wb", Afin qu'une malheureuse traduction de nouvelle ligne ne gâche pas vos données.

Notez qu'une conséquence du système sous-jacent effectuant la traduction de la nouvelle ligne pour vous est que vous ne pouvez pas déterminer le nombre d'octets que vous pouvez lire à partir d'un fichier à l'aide de fseek (fichier, 0, SEEK_END) .

Enfin, voir Quelle est la différence entre le texte et les E/S binaires? sur FAQ comp.lang.c .

28
Alok Singhal

utilisez "rb" pour ouvrir un fichier binaire. Ensuite, les octets du fichier ne seront pas encodés lorsque vous les lirez

8
sagie
  • "r" est le même que "rt" pour mode traduit
  • "rb" est un mode non traduit.

Cela fait une différence sur Windows, au moins. Voir ce lien pour plus de détails.

7
Alex Budovski

Sur la plupart des systèmes POSIX, il est ignoré. Mais vérifiez votre système pour en être sûr.

XNU

La chaîne de mode peut également inclure la lettre "b" comme dernier caractère ou comme caractère entre les caractères de l'une des chaînes de deux caractères décrites ci-dessus. Ceci est strictement pour la compatibilité avec ISO/IEC 9899: 1990 ("ISO C90") et n'a aucun effet; le "b" est ignoré.

Linux

La chaîne de mode peut également inclure la lettre "b" comme dernier caractère ou comme caractère entre les caractères de l'une des chaînes de deux caractères décrites ci-dessus. Ceci est strictement pour la compatibilité avec C89 et n'a aucun effet; le "b" est ignoré sur tous les systèmes conformes POSIX, y compris Linux. (D'autres systèmes peuvent traiter différemment les fichiers texte et les fichiers binaires, et l'ajout du "b" peut être une bonne idée si vous effectuez des E/S dans un fichier binaire et que vous vous attendez à ce que votre programme soit porté vers des environnements non UNIX.)

2
nathansizemore