Utilisation de get line () avec plusieurs types de caractères de fin de ligne

J’utilise std :: getline () de la manière suivante:

std::fstream verify; verify.open(myURI.c_str()); std::ssortingng countingLine; if(verify.is_open()){ std::getline(verify, countingLine); std::issortingngstream iss(countingLine); size_t pos; // Check for the conventional myFile header. pos = iss.str().find("Time,Group,Percent,Sign,Focus"); if(pos == std::ssortingng::npos){//its not there headerChk = false; this->setStatusMessage("Invalid header for myFile file"); return 0; } // loop that does more validation iss.clear(); } 

Le problème est que je code sur un Mac (et que certains fichiers sont modifiés à la fois avec les outils Windows et les outils Apple). Certains caractères de fin de ligne sont \ r au lieu de \ n, ainsi ma chaîne de fichier n’est jamais divisée en lignes. Je crois qu’il y a aussi un troisième que je devrais vérifier. Je ne parviens pas à trouver un exemple de configuration du paramètre delim pour plusieurs caractères endOfLine.

Si quelqu’un pouvait aider avec cet exemple ou une approche différente, ce serait formidable. Merci

std::getline() ne prend en charge qu’un caractère de fin de ligne. Lors de l’ouverture d’un fichier en mode texte, les séquences de fin de ligne du système sont converties en un seul caractère de fin de ligne ( \n ). Cependant, cela ne concerne pas les séquences de caractères de fin de ligne des autres systèmes. Pratiquement, tout ce qui rest à faire est de supprimer le caractère \r de l’entrée restante. La meilleure façon de supprimer des caractères est probablement de créer un tampon de stream de filtrage. Voici un exemple sortingvial, non testé et probablement lent (il ne s’agit pas d’une mise en mémoire tampon, ce qui signifie qu’il existe un appel de fonction virtuelle pour chaque caractère; c’est horrible; créer une version avec mise en mémoire tampon n’est cependant pas plus difficile):

 class normalizebuf : std::streambuf { std::streambuf* sbuf_; char buffer_[1]; public: normalizebuf(std::streambuf* sbuf): sbuf_(sbuf) {} int underflow() { int c = this->sbuf_->sbumpc(); while (c == std::char_traits::to_int_type('\r')) { c = this->sbuf->sbumpc(); } if (c != std::char_traits::eof()) { this->buffer_[0] = std::char_traits::to_char_type(c); this->setg(this->buffer_, this->buffer_, this->buffer_ + 1); } return c; }; 

Vous utiliseriez ce filtre avec un tampon de stream existant, à peu près comme ceci:

 std::ifstream fin("foo"); normalizebuf sbuf(fin.rdbuf()); std::istream in(&sbuf); 

… et vous utiliseriez ensuite pour lire le fichier avec tous les caractères supprimés.