Maison > développement back-end > C++ > Comment puis-je gérer de manière fiable les conventions de nouvelle ligne mixtes en C à l'aide de « std :: ifstream » ?

Comment puis-je gérer de manière fiable les conventions de nouvelle ligne mixtes en C à l'aide de « std :: ifstream » ?

Patricia Arquette
Libérer: 2024-12-06 16:39:18
original
751 Les gens l'ont consulté

How Can I Reliably Handle Mixed Newline Conventions in C   Using `std::ifstream`?

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) ...
}
Copier après la connexion

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 :

  • 'n' : renvoie la ligne.
  • 'r' : vérifie si le caractère suivant est 'n' et avance si vrai. Ensuite, renvoie la ligne.
  • std::streambuf::traits_type::eof() : définit le flux à l'état eof si la ligne ne se termine pas par une nouvelle ligne.
  • Autre caractères : ajoute le caractère à la chaîne.

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;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal