Home >Backend Development >C++ >How Can I Reliably Read Lines from a File with Mixed Line Endings in C ?
Overcoming Line Ending Discrepancies with std :: ifstream
When working with text files, line endings can vary across platforms, leading to potential compatibility issues. While the C runtime typically handles line endings correctly, it is crucial to consider scenarios where text files are shared across platforms.
To address this, let's explore a custom function, safeGetline, that seamlessly handles all three common line ending formats (r, n, and 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; } } }
This function operates by reading characters one by one from the stream using a stream buffer, which is more efficient than reading individual characters directly from the input stream. It handles various line ending conventions and also accounts for the possibility of an empty last line without a line break.
To demonstrate the usage of this function, let's create a simple test program:
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; }
By utilizing the safeGetline function, this program can accurately count the number of lines in the specified text file, regardless of the line ending format.
The above is the detailed content of How Can I Reliably Read Lines from a File with Mixed Line Endings in C ?. For more information, please follow other related articles on the PHP Chinese website!