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) ... }
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:
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; }
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!