Heim > Backend-Entwicklung > C++ > Wie kann ich Zeilen aus einer Datei mit gemischten Zeilenenden in C zuverlässig lesen?

Wie kann ich Zeilen aus einer Datei mit gemischten Zeilenenden in C zuverlässig lesen?

Linda Hamilton
Freigeben: 2024-12-05 17:03:12
Original
232 Leute haben es durchsucht

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

Überwindung von Zeilenenddiskrepanzen mit std :: ifstream

Bei der Arbeit mit Textdateien können die Zeilenenden zwischen den Plattformen variieren, was zu potenzieller Kompatibilität führt Probleme. Während die C-Laufzeit normalerweise Zeilenenden korrekt verarbeitet, ist es wichtig, Szenarien zu berücksichtigen, in denen Textdateien plattformübergreifend gemeinsam genutzt werden.

Um dieses Problem zu beheben, erkunden wir eine benutzerdefinierte Funktion, „safeGetline“, die alle drei gängigen Zeilenenden nahtlos verarbeitet Formate (r, n und 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;
        }
    }
}
Nach dem Login kopieren

Diese Funktion liest Zeichen einzeln aus dem Stream mithilfe eines Stream-Puffers, was effizienter ist als das Lesen einzelne Zeichen direkt aus dem Eingabestream. Es behandelt verschiedene Zeilenendekonventionen und berücksichtigt auch die Möglichkeit einer leeren letzten Zeile ohne Zeilenumbruch.

Um die Verwendung dieser Funktion zu demonstrieren, erstellen wir ein einfaches Testprogramm:

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;
}
Nach dem Login kopieren

Durch die Verwendung der Funktion „safeGetline“ kann dieses Programm die Anzahl der Zeilen in der angegebenen Textdatei genau zählen, unabhängig vom Zeilenendformat.

Das obige ist der detaillierte Inhalt vonWie kann ich Zeilen aus einer Datei mit gemischten Zeilenenden in C zuverlässig lesen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage