Pourquoi CR LF est changé en LF sous Windows?

Sous Windows, lorsque vous lisez des caractères \r\n partir du fichier (ou stdin) en mode texte, \r est supprimé et vous ne lisez que \n .

Existe-t-il une norme selon laquelle il devrait en être ainsi?

Puis-je être sûr que cela sera vrai pour tout compilateur sous Windows? Est-ce que les autres combinaisons de caractères spécifiques à la plate-forme seront également remplacées par \n sur ces plates-formes?

J’utilise ce code pour générer l’entrée et utiliser ce code pour le lire. Les résultats sont ici . Vous remarquerez peut-être quelques

Oui, cela vient de la compatibilité avec C. Dans les stream de texte C, les lignes sont terminées par un caractère de nouvelle ligne. C’est la représentation interne du stream de texte vu par le programme. La bibliothèque d’E / S convertit entre la représentation interne et une représentation externe.

La représentation interne est indépendante de la plate-forme, alors qu’il existe différentes conventions spécifiques à la plate-forme pour le texte. C’est le but d’avoir un mode texte dans la bibliothèque de stream; Il est possible d’écrire des programmes de manipulation de texte portables qui ne doivent pas contenir une stack de directives #ifdef pour fonctionner sur différentes plates-formes ou créer leur propre abstraction de texte indépendante de la plate-forme.

Il arrive que la représentation interne des stream de texte C corresponde à la représentation Unix native des fichiers texte, puisque le langage C et sa bibliothèque sont issus d’Unix. Pour la portabilité des programmes C sur d’autres plates-formes, l’abstraction du stream de texte a été ajoutée, ce qui fait que les fichiers texte sur des systèmes non-Unix ressemblent à des fichiers texte Unix.

Dans la norme ISO / IEC 9899: 1999 (“C99”), nous avons ceci:

7.19.2 Flux

[…]

Un stream de texte est une séquence ordonnée de caractères composés en lignes, chaque ligne étant constituée de zéro ou plusieurs caractères, plus un caractère de nouvelle ligne se terminant. Si la dernière ligne nécessite un caractère de nouvelle ligne de terminaison est défini par la mise en œuvre. Des caractères peuvent devoir être ajoutés, modifiés ou supprimés en entrée et en sortie pour se conformer aux différentes conventions de représentation du texte dans l’environnement hôte. Ainsi, il n’est pas nécessaire d’avoir une correspondance univoque entre les caractères d’un stream et ceux de la représentation externe.

Emphase audacieuse la mienne Les stream C ++ sont définis en termes de stream C. Il n’y a pas d’explication du texte par rapport au mode binary dans le standard C ++, à l’exception d’une table qui associe diverses combinaisons d’indicateurs de mode de stream à des chaînes appropriées comme arguments de mode pour fopen .