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

j'ai essayé d'utiliser fopen en C, le second paramètre est le mode ouvert. Les deux modes "r" et " rb " ont tendance à m'embrouiller. Il semble qu'ils sont les mêmes. Mais il est parfois préférable d'utiliser "rb". Alors, pourquoi " r " existe? - Il m'expliquer en détail ou avec des exemples. remercier.

51
demandé sur Slothworks 2010-02-01 08:47:40

5 réponses

vous devez utiliser "r" pour ouvrir des fichiers texte. Différents systèmes d'exploitation ont légèrement différentes façons de stocker du texte, et ce sera d'effectuer les traductions correctes, de sorte que vous n'avez pas besoin de connaître les particularités du système d'exploitation local. Par exemple , vous saurez que newlines apparaîtra toujours comme un simple "\n" , quel que soit l'endroit où le code s'exécute.

vous devez utiliser "rb" si vous ouvrez des fichiers non-texte, parce que dans ce cas, les traductions ne sont pas appropriées.

64
répondu caf 2010-02-01 05:49:50

sur 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 sur les Unixes. Sur windows, 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 étaient juste un caractère, '\n' .

si vous voulez lire/écrire des fichiers texte sur n'importe quel système, utilisez "r" , et "w" dans fopen() . Qui va garantir que les fichiers sont écrits et lus correctement. Si vous ouvrez un fichier binaire, utilisez "rb" et "wb" , de sorte qu'une malheureuse translation de ligne ne perturbe pas vos données.

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

enfin, voir Quelle est la différence entre le texte et les entrées/sorties binaires? sur comp.lang.C FAQ .

25
répondu Alok Singhal 2017-05-23 11:54:43

utiliser "rb" pour ouvrir un fichier binaire. Alors les octets du fichier ne seront pas encodés quand vous les lirez

8
répondu sagie 2010-02-01 05:50:44

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

7
répondu Alex Budovski 2010-02-01 05:53:04

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

XNU

la chaîne de caractères mode peut aussi inclure la lettre " b " comme dernier caractère ou comme caractère entre les caractères de l'une des chaînes de 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 un dernier personnage ou un personnage entre les personnages dans l'un des deux- les chaînes de caractères décrites ci-dessus. C'est strictement pour compatibilité avec C89 et n'a aucun effet; le " b " est ignoré par tous Systèmes conformes à POSIX, y compris Linux. (D'autres systèmes peuvent traiter les fichiers texte et les fichiers binaires différemment, et l'ajout d'un " b " peut être un bonne idée si vous faites I / O à un fichier binaire et s'attendre à ce que votre programme peut être porté vers des environnements non-UNIX.)

2
répondu nathansizemore 2017-01-12 16:09:46