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

Quelle traduction se produit lors de l’écriture dans un fichier ouvert en mode texte qui ne se produit pas en mode binary? Spécifiquement en MS Visual C.

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

Mode binary:

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

Versus mode texte:

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

Je crois que la plupart des plates-formes ignoreront l’option “t” ou l’option “mode-texte” pour traiter les stream. Sur windows, ce n’est pas le cas. Si vous regardez la description de la fonction fopen () sur: MSDN , vous verrez que spécifier l’option “t” aura l’effet suivant:

  • les sauts de ligne (‘\ n’) seront traduits en ‘\ r \ n “séquences en sortie
  • les retours chariot / séquences de sauts de ligne seront convertis 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 cas malheureux de l’époque de la CPM (quelque chose sur les péchés des parents visités par leurs enfants jusqu’à la 3ème ou 4ème génération). Contrairement à l’opinion exprimée précédemment, le caractère ctrl-z ne sera pas ajouté.

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

Habituellement, vous voudrez ouvrir en mode binary. Essayer de lire des données binarys en mode texte ne fonctionnera pas, il sera corrompu. Vous pouvez lire le texte ok en mode binary – il ne fera tout simplement pas les traductions automatiques de “\ n” vers “\ r \ n”.

Voir fopen

De plus, lorsque vous créez un fichier avec “rt”, l’entrée se termine sur un caractère Crtl-Z.

Une autre différence est l’utilisation de fseek

Si le stream est ouvert en mode binary, la nouvelle position est exactement compensée par les octets mesurés depuis le début du fichier si l’origine est SEEK_SET, depuis la position actuelle du fichier si l’origine est SEEK_CUR et à la fin du fichier si l’origine est SEEK_END. Certains stream binarys peuvent ne pas prendre en charge le SEEK_END.

Si le stream est ouvert en mode texte, les seules valeurs sockets en charge pour l’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 stream associé au même fichier (qui ne fonctionne qu’avec origine de SEEK_SET.

Nous avons eu un problème intéressant avec l’ouverture de fichiers en mode texte où les fichiers comportaient 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 et plus tard pour rouvrir le fichier et chercher à cette position (nous avons utilisé fsetpos).

Cependant, lorsqu’un fichier a des mélanges de fins de ligne, ce processus n’a pas réussi à rechercher la même position. Dans notre cas (notre outil parsing le C ++), nous relisons des parties du fichier que nous avions déjà vues.

Aller avec binary – alors vous pouvez contrôler exactement ce qui est lu et écrit à partir du fichier.