web-dev-qa-db-fra.com

Différence entre les fichiers écrits en mode binaire et texte

Quelle traduction se produit lors de l'écriture dans un fichier ouvert en mode texte qui ne se produit pas en mode binaire? Plus précisément dans MS Visual C.

unsigned char buffer[256];
for (int i = 0; i < 256; i++) buffer[i]=i;
int size  = 1;
int count = 256;

Mode binaire:

FILE *fp_binary = fopen(filename, "wb");
fwrite(buffer, size, count, fp_binary);

Mode texte versus:

FILE *fp_text = fopen(filename, "wt");
fwrite(buffer, size, count, fp_text);
54
jholl

Je crois que la plupart des plates-formes ignoreront l'option "t" ou l'option "mode texte" lorsqu'elles traitent avec des flux. Sur les fenêtres, cependant, ce n'est pas le cas. Si vous jetez un oeil à la description de la fonction fopen () à: MSDN , vous verrez que la spécification de l'option "t" aura l'effet suivant :

  • les sauts de ligne ('\ n') seront traduits en séquences '\ r\n "en sortie
  • les séquences de retour chariot/saut de ligne seront converties en sauts de ligne en entrée.
  • Si le fichier est ouvert en mode ajout, la fin du fichier sera examinée pour un caractère ctrl-z (caractère 26) et ce caractère supprimé, si possible. Il interprétera également la présence de ce caractère comme étant la fin du fichier. Il s'agit d'un reliquat malheureux de l'époque du CPM (quelque chose sur les péchés des parents visités sur leurs enfants jusqu'à la 3e ou 4e génération). Contrairement à l'opinion précédemment exprimée, le caractère ctrl-z ne sera pas ajouté.
45
Jon Trauntvein

En mode texte, une nouvelle ligne "\ n" peut être convertie en retour chariot + nouvelle ligne "\ r\n"

Habituellement, vous voudrez ouvrir en mode binaire. Essayer de lire des données binaires en mode texte ne fonctionnera pas, il sera corrompu. Vous pouvez cependant lire le texte ok en mode binaire - il ne fera tout simplement pas les traductions automatiques de "\ n" en "\ r\n".

Voir fopen

27
MrZebra

De plus, lorsque vous ouvrez un fichier avec "rt", l'entrée se termine par un caractère Ctrl-Z.

5
SmacL

Une autre différence est lors de l'utilisation de fseek

Si le flux est ouvert en mode binaire, la nouvelle position est exactement des octets décalés mesurés depuis le début du fichier si Origin est SEEK_SET, depuis la position actuelle du fichier si Origin est SEEK_CUR et depuis la fin du fichier si Origin est SEEK_END. Certains flux binaires peuvent ne pas prendre en charge SEEK_END.

Si le flux est ouvert en mode texte, les seules valeurs prises en charge pour offset sont zéro (qui fonctionne avec n'importe quelle origine) et une valeur renvoyée par un appel antérieur à std :: ftell sur un flux associé au même fichier (qui ne fonctionne qu'avec Origine de SEEK_SET.

4
Ming

Nous avons eu un problème intéressant avec l'ouverture de fichiers en mode texte où les fichiers avaient un mélange de caractères de fin de ligne:

1\n\r
2\n\r
3\n
4\n\r
5\n\r

Notre exigence est que nous puissions stocker notre position actuelle dans le fichier (nous avons utilisé fgetpos), fermer le fichier, puis plus tard pour rouvrir le fichier et rechercher cette position (nous avons utilisé fsetpos).

Cependant, lorsqu'un fichier contient des mélanges de fins de ligne, ce processus n'a pas réussi à rechercher la même position. Dans notre cas (notre outil analyse C++), nous étions en train de relire des parties du fichier que nous avions déjà vues.

Allez avec binaire - alors vous pouvez contrôler exactement ce qui est lu et écrit à partir du fichier.

3
Richard Corden