Maison >développement back-end >C++ >Comment gérer avec élégance différentes fins de ligne dans `std::getline` de C ?
Gérer gracieusement différentes fins de ligne dans std::istream::getline
Lors de la lecture de fichiers texte, vous rencontrez différentes fins de ligne telles que 'n ', 'r' et 'rn' peuvent poser des défis. std::getline est une fonction pratique pour récupérer des lignes d'un flux d'entrée, mais elle peut laisser des caractères « r » résiduels à la fin de la chaîne.
Comme l'a souligné Neil, le runtime C est généralement équipé pour gérer les conventions de fin de ligne basées sur la plate-forme. Cependant, l'interopérabilité entre différents systèmes nécessite une approche plus robuste.
Voici une fonction personnalisée qui traite de manière transparente les trois types de fin de ligne :
std::istream& safeGetline(std::istream& is, std::string& t) { t.clear(); std::istream::sentry se(is, true); std::streambuf* sb = is.rdbuf(); for(;;) { int c = sb->sbumpc(); switch (c) { case '\n': return is; case '\r': if(sb->sgetc() == '\n') sb->sbumpc(); return is; case std::streambuf::traits_type::eof(): if(t.empty()) is.setstate(std::ios::eofbit); return is; default: t += (char)c; } } }
Dans cette fonction, nous utilisons un objet streambuf pour lire les caractères un par un efficacement. Chaque caractère est examiné et, en fonction de son type, des actions appropriées sont prises pour gérer les fins de ligne.
Un exemple de programme de test illustre l'utilisation de safeGetline :
int main() { std::string path = ... // Insert path to test file here std::ifstream ifs(path.c_str()); if(!ifs) { std::cout << "Failed to open the file." << std::endl; return EXIT_FAILURE; } int n = 0; std::string t; while(!safeGetline(ifs, t).eof()) ++n; std::cout << "The file contains " << n << " lines." << std::endl; return EXIT_SUCCESS; }
En employant cette approche, vous pouvez lire en toute confiance des fichiers texte d'origines diverses, garantissant une gestion gracieuse des différentes fins de ligne.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!