Maison > développement back-end > C++ > Comment gérer avec élégance différentes fins de ligne dans `std::getline` de C ?

Comment gérer avec élégance différentes fins de ligne dans `std::getline` de C ?

Patricia Arquette
Libérer: 2024-12-08 07:59:10
original
807 Les gens l'ont consulté

How to Gracefully Handle Different Line Endings in C  's `std::getline`?

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

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

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!

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