Ü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; } } }
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; }
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!