Changement de std::endl de mettre CR+LF au lieu de LF
Je suis en train d'écrire un programme sur une plate-forme Linux qui génère des fichiers de texte qui seront affichés sur, inévitablement, une plate-forme Windows.
Dès maintenant, en passant std::endl
dans un ostream
génère le caractère CR uniquement pour les retours à la ligne. Naturellement, ces fichiers texte sont incorrectes dans MS le bloc-notes.
- Est-il un moyen de changer
std::endl
tel qu'il utilise CR+LF pour le saut de ligne à la place de la FL? - Je sais que je pourrais écrire mon propre manipulateur, comme
win_endl
, pour la génération de mes propres retours à la ligne, mais j'utilise lastd::endl
symbole dans beaucoup d'endroits, et comme beaucoup de programmeurs, ont tendance à faire la chose qui nécessite le moins de travail possible. Pourrais-je simplement de surchargestd::endl
pour produire CR+LF, ou est-ce une idée stupide pour la maintenabilité?
NB: j'ai vérifié cette question, mais elle demande d'aller dans l'autre sens, et l'on a accepté la réponse semble plutôt incomplète.
Une autre option est d'utiliser un outil de Windows qui sait comment traiter avec le style Unix retours à la ligne (c'est à dire., presque n'importe quel éditeur autre que le bloc-notes), ou d'utiliser un outil qui convertit les fins de ligne (communément appelé unix2dos.exe ou quelque chose).
Burr - bonne idée, mais difficile à soutenir avec notre base de clients est ma réaction instinctive.
Il n'a pas à s'exécuter sur la machine du client - il y a des filtres qui vais faire la même chose sur une machine Unix. Vous pouvez avoir les fichiers de sortie produite par votre programme actuel courir à travers le filtre avant de vous emballer pour la distribution au client. Il semble hacky, mais je pense que il pourrait effectivement être moins hacky de coucher avec le C++ streamio (et c'est probablement beaucoup moins de travail).
Burr - votre deuxième point, c'est aussi une bonne idée, et que je pensais à propos un peu. Peut-être que j'ai besoin de réfléchir un peu plus. La principale raison que j'ai hésité à l'idée que je voulais vraiment garder le "filtrage" dans mon C++ application au lieu d'appeler un programme externe sur la résultante de fichier. Tournez vos commentaires en réponse à une question, et je vais vous donner un +1.
Le problème, c'est que vous avez utilisé
Burr - bonne idée, mais difficile à soutenir avec notre base de clients est ma réaction instinctive.
Il n'a pas à s'exécuter sur la machine du client - il y a des filtres qui vais faire la même chose sur une machine Unix. Vous pouvez avoir les fichiers de sortie produite par votre programme actuel courir à travers le filtre avant de vous emballer pour la distribution au client. Il semble hacky, mais je pense que il pourrait effectivement être moins hacky de coucher avec le C++ streamio (et c'est probablement beaucoup moins de travail).
Burr - votre deuxième point, c'est aussi une bonne idée, et que je pensais à propos un peu. Peut-être que j'ai besoin de réfléchir un peu plus. La principale raison que j'ai hésité à l'idée que je voulais vraiment garder le "filtrage" dans mon C++ application au lieu d'appeler un programme externe sur la résultante de fichier. Tournez vos commentaires en réponse à une question, et je vais vous donner un +1.
Le problème, c'est que vous avez utilisé
std::endl
, qui vous ne pas parce que Dans de nombreuses implémentations, la sortie standard est la ligne de tampon, et l'écriture de '\n' provoque une rougeur de toute façon, à moins que std::ios::sync_with_stdio(faux) a été exécuté. Dans ces situations, inutile endl seulement nuit à la performance de sortie de fichier, pas de sortie standardOriginalL'auteur J. Polfer | 2009-10-30
Vous devez vous connecter pour publier un commentaire.
L'ouverture d'un fichier en mode texte devrait provoquer
std::endl
être convertis à la ligne appropriée de la fin de votre plate-forme. Votre problème, c'est que le saut de ligne est approprié pour votre plate-forme, mais les fichiers que vous créez ne sont pas destinés à votre plate-forme.Je ne suis pas sûr de la façon dont vous prévoyez de surcharge ou de changer
endl
, et de modifier son comportement serait certainement être surprenant pour les développeurs de nouvelles à votre projet. Je voudrais vous recommandons de passer à win_endl (ce qui devrait être un simple rechercher /remplacer) ou peut-être le passage d'un standardostream
à un Coup de pouce.Iostreams de filtrage de flux pour faire la conversion pour vous.Aurait emprunté cette voie (toujours en mai, si la macro devient lourd à gérer), mais nous avons un dingo système pour obtenir boost pkgs au travail, et j'aurais eu à bug quelqu'un pour passer au travers de certains galimatias de l'obtenir pour ma console.
OriginalL'auteur Josh Kelley
std::endl
est essentiellement:Juste utiliser
"\r\n"
au lieu et omettre la chasse d'eau. Il est plus rapide de cette façon, aussi!De la ostream fichier d'en-tête sur endl:
\r\r\n
dans la sortie (depuis\n
lui-même sera élargie dans\r\n
pour un flux de texte).Ce ne sera pas porté sous Windows, je ne pense pas. Nous avons probablement ne pouvait pas gérer l'octroi de licences. lol
+1 - Bonne info sur la endl manipulateur. Il me semble que je vais utiliser moins souvent maintenant.
Si votre fichier est en mode texte. Le caractère '\n' est traduit en une plate-forme spécifique de fin de ligne de la séquence lorsque vous écrivez dans le fichier. Et la fin de la ligne de séquence est traduit en '\n' lorsque vous lisez à partir du fichier.
OriginalL'auteur ebo
Bloc-notes de Windows est à peu près la seulement programme Windows, vous trouverez que ne gère pas les LF-seuls les fichiers correctement. Presque tout le reste (y compris WordPad) poignées LF-seuls les fichiers très bien.
Ce problème est un bug dans le bloc-notes.
générer le code html à la place?
Si vous devez créer des fichiers avec CRLF les fins de ligne, exécutez le fichier de sortie(s) à travers un filtre qui est indépendant de votre programme lui-même. Vous pouvez trouver ce genre de filtre facilement, cherchez
unix2dos
ou quelque chose comme ça. Cela vous permettra de garder cette plate-forme spécifique à la logique de votre programme.Cependant, n'oubliez pas que les programmes Unix sont généralement impitoyable de la lecture des fichiers texte qui contiennent des "\r\n" fins de ligne - à partir de mon expérience limitée avec Unix, ce qui semble être une plus large propagation de la question (en termes de nombre de programmes qui ne sont pas bien avec des non-natifs des fins de ligne).
OriginalL'auteur Greg Hewgill
Vous ne devriez pas utiliser \r\n. Suffit d'utiliser \n, mais ensuite ouvrir le flux en mode "texte", qui permettra de faire la conversion pour vous. Vous ne peuvent pas se soucier de la croix-plate-forme, mais c'est le moyen officiel de le faire.
De cette façon, le même code à la broche out \n sur unix, \r\n sur windows, et \r sur mac.
Le programme qui génère le fichier texte toujours être exécuté sur une plate-forme Linux, et il ne sera pas fonctionner sur Win/Mac. Les machines que lire le fichier texte doit être en cours d'exécution à la consommation des Systèmes d'exploitation (Windows, Mac, Linux).
Avez-vous réellement lu la question?
Le problème, c'est le bloc-notes, aussi simple que l'application est, de ne pas respecter d'autres retours à la ligne. D'autres plates-formes de texte par défaut de rédaction, de sorte qu'il est d'être forcé à le faire
\r\n
, de sorte que Windows joue aussi très bien.\r comme EOL a été utilisé sur Mac OS 9, OS X utilise \n.
OriginalL'auteur zumalifeguard
C'était ma solution au problème. C'est un peu un mash-up de toutes les informations fournies dans les réponses:
J'ai créé une macro dans un win_endl.h fichier pour le retour à la ligne que je voulais:
Puis j'ai fait une recherche et remplacer:
Et de veiller à ce que tout mes fichiers inclus
win_endl.h
.Neal - Bon point.
OriginalL'auteur J. Polfer