Heim > Backend-Entwicklung > C++ > Wie gehe ich elegant mit verschiedenen Zeilenenden in „std::getline' von C um?

Wie gehe ich elegant mit verschiedenen Zeilenenden in „std::getline' von C um?

Patricia Arquette
Freigeben: 2024-12-08 07:59:10
Original
798 Leute haben es durchsucht

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

Anmutiger Umgang mit unterschiedlichen Zeilenenden in std::istream::getline

Wenn Sie Textdateien lesen, stoßen Sie auf unterschiedliche Zeilenenden wie „n“. ', 'r' und 'rn' können eine Herausforderung darstellen. std::getline ist eine praktische Funktion zum Abrufen von Zeilen aus einem Eingabestream, hinterlässt jedoch möglicherweise verbleibende „r“-Zeichen am Ende der Zeichenfolge.

Wie Neil betonte, ist die C-Laufzeit im Allgemeinen ausgestattet um Zeilenendekonventionen basierend auf der Plattform zu handhaben. Die Interoperabilität zwischen verschiedenen Systemen erfordert jedoch einen robusteren Ansatz.

Hier ist eine angepasste Funktion, die alle drei Zeilenendtypen nahtlos verarbeitet:

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

In dieser Funktion verwenden wir ein Streambuf-Objekt, um Lesen Sie Zeichen effizient einzeln nacheinander. Jedes Zeichen wird untersucht und basierend auf seinem Typ werden geeignete Maßnahmen zum Umgang mit Zeilenenden ergriffen.

Ein Beispieltestprogramm veranschaulicht die Verwendung von 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;
}
Nach dem Login kopieren

Durch die Verwendung dieses Ansatzes Sie können Textdateien unterschiedlicher Herkunft sicher lesen und dabei eine elegante Handhabung unterschiedlicher Zeilenenden gewährleisten.

Das obige ist der detaillierte Inhalt vonWie gehe ich elegant mit verschiedenen Zeilenenden in „std::getline' von C um?. 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