Gestion de différentes conventions de nouvelle ligne avec std::ifstream
Bien que le runtime C gère généralement les conventions de nouvelle ligne basées sur la plate-forme, il existe des cas où les fichiers texte contenant divers formats de nouvelle ligne doivent être traités uniformément. Cet article explique comment y parvenir en utilisant std::ifstream.
Le problème
getline(istream&, string&) attend un caractère 'n' pour marquer la fin de une ligne, mais les fichiers texte peuvent contenir « r », « n » ou les deux dans différentes combinaisons. Si un caractère 'r' précède un 'n', il peut être inclus dans la ligne récupérée, provoquant des incohérences.
La solution
Il n'y a aucune option dans le Constructeur ifstream pour convertir directement divers encodages de nouvelle ligne en « n ». Cependant, une fonction personnalisée peut être créée pour gérer cette situation :
std::istream& safeGetline(std::istream& is, std::string& t) { // ... Implementation here (see below) ... }
Détails d'implémentation
La fonction safeGetline utilise un streambuf pour lire les caractères un par un, fournissant meilleure efficacité que d'utiliser directement std::istream. Il parcourt le flux, en gérant différentes conventions de nouvelle ligne :
Test Programme
Un exemple de programme de test démontre l'utilisation de la fonction safeGetline :
int main() { // Open a file and check for errors. int n = 0; std::string t; while (!safeGetline(ifs, t).eof()) ++n; std::cout << "The file contains " << n << " lines." << std::endl; return EXIT_SUCCESS; }
Conclusion
L'utilisation de la fonction safeGetline élimine le nécessite une gestion manuelle des nouvelles lignes et garantit une récupération de ligne cohérente dans différentes conventions de nouvelle ligne. Cette approche fournit une solution robuste et flexible pour traiter des fichiers texte provenant de diverses sources.
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!