Heim > Backend-Entwicklung > C++ > Wie kann ich mit „std::ifstream' zuverlässig mit gemischten Newline-Konventionen in C umgehen?

Wie kann ich mit „std::ifstream' zuverlässig mit gemischten Newline-Konventionen in C umgehen?

Patricia Arquette
Freigeben: 2024-12-06 16:39:18
Original
751 Leute haben es durchsucht

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

Umgang mit verschiedenen Newline-Konventionen mit std::ifstream

Während die C-Laufzeit normalerweise Newline-Konventionen basierend auf der Plattform verarbeitet, gibt es Fälle, in denen dies der Fall ist Textdateien mit unterschiedlichen Zeilenumbruchformaten müssen einheitlich verarbeitet werden. In diesem Artikel wird untersucht, wie Sie dies mit std::ifstream erreichen können.

Das Problem

getline(istream&, string&) erwartet ein „n“-Zeichen, um das Ende von zu markieren eine Zeile, aber Textdateien können „r“, „n“ oder beides in unterschiedlichen Kombinationen enthalten. Wenn ein „r“-Zeichen vor einem „n“ steht, kann es in die abgerufene Zeile eingefügt werden, was zu Inkonsistenzen führt.

Die Lösung

Es gibt keine Option im ifstream-Konstruktor zum direkten Konvertieren verschiedener Newline-Kodierungen in „n“. Es kann jedoch eine benutzerdefinierte Funktion erstellt werden, um diese Situation zu bewältigen:

std::istream& safeGetline(std::istream& is, std::string& t)
{
    // ... Implementation here (see below) ...
}
Nach dem Login kopieren

Implementierungsdetails

Die Funktion „safeGetline“ verwendet einen Streambuf, um Zeichen einzeln zu lesen und bereitzustellen bessere Effizienz als die direkte Verwendung von std::istream. Es durchläuft den Stream und behandelt dabei verschiedene Newline-Konventionen:

  • 'n': Gibt die Zeile zurück.
  • 'r': Prüft, ob das nächste Zeichen 'n' ist, und rückt vor, wenn WAHR. Gibt dann die Zeile zurück.
  • std::streambuf::traits_type::eof(): Setzt den Stream in den eof-Zustand, wenn die Zeile nicht mit einer neuen Zeile endet.
  • Sonstiges Zeichen: Hängt das Zeichen an die Zeichenfolge an.

Test Programm

Ein Beispieltestprogramm demonstriert die Verwendung der Funktion „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;
}
Nach dem Login kopieren

Fazit

Die Verwendung der Funktion „safeGetline“ eliminiert die Die manuelle Handhabung von Zeilenumbrüchen ist nicht mehr erforderlich und gewährleistet einen konsistenten Zeilenabruf über verschiedene Zeilenumbruchkonventionen hinweg. Dieser Ansatz bietet eine robuste und flexible Lösung für die Verarbeitung von Textdateien, die aus verschiedenen Quellen stammen.

Das obige ist der detaillierte Inhalt vonWie kann ich mit „std::ifstream' zuverlässig mit gemischten Newline-Konventionen in C umgehen?. 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