Maison > développement back-end > C++ > Comment puis-je lire de manière fiable les lignes d'un fichier avec des fins de lignes mixtes en C ?

Comment puis-je lire de manière fiable les lignes d'un fichier avec des fins de lignes mixtes en C ?

Linda Hamilton
Libérer: 2024-12-05 17:03:12
original
231 Les gens l'ont consulté

How Can I Reliably Read Lines from a File with Mixed Line Endings in C  ?

Surmonter les différences de fin de ligne avec std :: ifstream

Lorsque vous travaillez avec des fichiers texte, les fins de ligne peuvent varier selon les plates-formes, ce qui entraîne une compatibilité potentielle problèmes. Bien que le runtime C gère généralement correctement les fins de ligne, il est crucial d'envisager des scénarios dans lesquels des fichiers texte sont partagés entre plates-formes.

Pour résoudre ce problème, explorons une fonction personnalisée, safeGetline, qui gère de manière transparente les trois fins de ligne courantes. formats (r, n et rn) :

std::istream& safeGetline(std::istream& is, std::string& t)
{
    // Reset the string to be sure
    t.clear();

    // Utilize a sentry object for synchronized stream access
    std::istream::sentry se(is, true);
    std::streambuf* sb = is.rdbuf();

    while (true)
    {
        // Fetch the next character
        int c = sb->sbumpc();

        switch (c)
        {
            case '\n':
                // Encountered a line ending with just \n
                return is;
            case '\r':
                // Possibility of \r\n line ending
                if (sb->sgetc() == '\n')
                    sb->sbumpc();
                return is;
            case std::streambuf::traits_type::eof():
                // End of file reached
                if (t.empty())
                    is.setstate(std::ios::eofbit);
                return is;
            default:
                // Append the character to the string
                t += (char)c;
        }
    }
}
Copier après la connexion

Cette fonction fonctionne en lisant les caractères un par un du flux à l'aide d'un tampon de flux, ce qui est plus efficace que la lecture de caractères individuels directement à partir du flux d’entrée. Il gère diverses conventions de fin de ligne et prend également en compte la possibilité d'une dernière ligne vide sans saut de ligne.

Pour démontrer l'utilisation de cette fonction, créons un programme de test simple :

int main()
{
    // Specify the path to the text file containing lines with different line endings
    std::string path = ...;

    // Open the file for input
    std::ifstream ifs(path.c_str());
    if (!ifs)
    {
        std::cout << "Error opening the file." << std::endl;
        return EXIT_FAILURE;
    }

    // Count the number of lines in the file
    int n = 0;
    std::string line;
    while (!safeGetline(ifs, line).eof())
        ++n;

    // Display the count of lines
    std::cout << "The file contains " << n << " lines." << std::endl;
    return EXIT_SUCCESS;
}
Copier après la connexion

En utilisant la fonction safeGetline, ce programme peut compter avec précision le nombre de lignes dans le fichier texte spécifié, quel que soit le format de fin 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