Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Membaca Baris dengan Amanah daripada Fail dengan Pengakhiran Baris Campuran dalam C?
Mengatasi Percanggahan Pengakhiran Baris dengan std :: ifstream
Apabila bekerja dengan fail teks, pengakhiran baris boleh berbeza-beza merentas platform, yang membawa kepada potensi keserasian isu. Walaupun masa jalan C biasanya mengendalikan pengakhiran baris dengan betul, adalah penting untuk mempertimbangkan senario di mana fail teks dikongsi merentas platform.
Untuk menangani perkara ini, mari kita terokai fungsi tersuai, safeGetline, yang mengendalikan ketiga-tiga penghujung baris biasa dengan lancar format (r, n, dan 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; } } }
Fungsi ini beroperasi dengan membaca aksara satu demi satu satu daripada strim menggunakan penimbal strim, yang lebih cekap daripada membaca aksara individu secara terus daripada strim input. Ia mengendalikan pelbagai konvensyen penamat baris dan juga mengambil kira kemungkinan baris terakhir kosong tanpa pemisah baris.
Untuk menunjukkan penggunaan fungsi ini, mari buat program ujian mudah:
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; }
Dengan menggunakan fungsi safeGetline, program ini boleh mengira bilangan baris dengan tepat dalam fail teks yang ditentukan, tanpa mengira penghujung baris format.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membaca Baris dengan Amanah daripada Fail dengan Pengakhiran Baris Campuran dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!