L'obtention de std :: ifstream pour gérer LF, CR, et CRLF?

Spécifiquement, je m'intéresse à istream& getline ( istream& is, string& str );. Est-il une option pour le ifstream constructeur pour lui demander de convertir tous les newline codages de '\n' sous le capot? Je veux être en mesure d'appeler getline et ont gracieusement gérer toutes les fins de ligne.

Mise à jour: Pour clarifier, je veux être capable d'écrire du code qui compile presque n'importe où, et va prendre une entrée à partir de presque n'importe où. Y compris les rares fichiers qui ont '\r' sans '\n'. En minimisant les inconvénients pour les utilisateurs du logiciel.

Il est facile de contourner le problème, mais je suis toujours curieux de connaître le droit chemin, dans la norme, pour la souplesse gérer tous les formats de fichier texte.

getline lit une ligne entière, jusqu'à un '\n', dans une chaîne de caractères. Le '\n' est consommé à partir du flux, mais getline ne pas l'inclure dans la chaîne. C'est très bien jusqu'à présent, mais il pourrait y avoir un '\r' juste avant le '\n' qui est inclus dans la chaîne.

Il y a trois types de fins de ligne vu dans les fichiers de texte:
'\n') est le classique se terminant sur des machines Unix, '\r' était (je pense) utilisé sur les anciens systèmes d'exploitation Mac et Windows utilise une paire, '\r' suivi par '\n'.

Le problème est que getline quitte le '\r' sur la fin de la chaîne.

ifstream f("a_text_file_of_unknown_origin");
string line;
getline(f, line);
if(!f.fail()) { //a non-empty line was read
   //BUT, there might be an '\r' at the end now.
}

Modifier Merci à Neil pour préciser que f.good() n'est pas ce que je voulais. !f.fail() est ce que je veux.

Je peux le supprimer manuellement moi-même (voir l'édition de cette question), ce qui est facile pour les Windows fichiers texte. Mais je suis inquiet que quelqu'un, un aliment dans un fichier ne contenant que des '\r'. Dans ce cas, je présume que getline consomme l'ensemble du fichier, en pensant que c'est une seule ligne!

.. et c'est même pas envisagé Unicode 🙂

.. peut-être Boost est une belle façon de consommer, ligne par ligne à partir de n'importe quel texte-type de fichier?

Modifier je suis en utilisant ce, pour gérer les fichiers de Windows, mais j'ai toujours l'impression que je ne devrais pas! Et ce ne sera pas la fourche pour le '\r'-seuls les fichiers.

if(!line.empty() && *line.rbegin() == '\r') {
    line.erase( line.length()-1, 1);
}
\n nouvelle ligne en tout ce qui est présenté dans le courant de l'OS. La bibliothèque se charge de tout. Mais pour que cela fonctionne, un programme compilé sous windows doit de lire des fichiers texte à partir de windows, un programme compilé sous unix, les fichiers texte à partir d'unix etc.
même si je suis de compiler sur une machine Linux, parfois, je suis en utilisant des fichiers texte qui sont venus à l'origine à partir d'une machine Windows. Je pourrais sortir mon logiciel (un petit outil pour l'analyse de réseau), et je veux être en mesure d'indiquer aux utilisateurs qu'ils peuvent se nourrir dans presque n'importe quel moment de l' (ASCII) fichier texte.
Peu de cas de test qui démontre votre question.
Notez que si(f.bonne()) ne fait pas ce que vous semblez penser qu'il fait.
Il peut avoir été comme ceci. Peut-être.

OriginalL'auteur Aaron McDaid | 2011-05-22