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);
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 :
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
De plus, lorsque vous ouvrez un fichier avec "rt", l'entrée se termine par un caractère Ctrl-Z.
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.
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.