Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengendalikan Konvensyen Barisan Baharu Bercampur dalam C Menggunakan `std::ifstream`?

Bagaimanakah Saya Boleh Mengendalikan Konvensyen Barisan Baharu Bercampur dalam C Menggunakan `std::ifstream`?

Patricia Arquette
Patricia Arquetteasal
2024-12-06 16:39:18766semak imbas

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

Mengendalikan Konvensyen Baris Baharu Berbeza dengan std::ifstream

Walaupun masa jalan C biasanya mengendalikan konvensyen baris baharu berdasarkan platform, terdapat keadaan di mana fail teks yang mengandungi pelbagai format baris baharu perlu diproses secara seragam. Artikel ini meneroka cara untuk mencapai ini menggunakan std::ifstream.

Masalahnya

getline(istream&, string&) menjangkakan aksara 'n' menandakan berakhirnya baris, tetapi fail teks mungkin mengandungi 'r', 'n', atau kedua-duanya dalam kombinasi yang berbeza-beza. Jika aksara 'r' mendahului 'n', ia boleh disertakan dalam baris yang diambil, menyebabkan ketidakkonsistenan.

Penyelesaian

Tiada pilihan dalam pembina ifstream untuk menukar pelbagai pengekodan baris baharu kepada 'n' secara langsung. Walau bagaimanapun, fungsi tersuai boleh dibuat untuk mengendalikan situasi ini:

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

Butiran Pelaksanaan

Fungsi safeGetline menggunakan streambuf untuk membaca aksara satu demi satu, menyediakan kecekapan yang lebih baik daripada menggunakan std::istream secara langsung. Ia berulang melalui strim, mengendalikan konvensyen baris baharu yang berbeza:

  • 'n': Mengembalikan baris.
  • 'r': Semak sama ada aksara seterusnya ialah 'n' dan maju jika benar. Kemudian, mengembalikan baris.
  • std::streambuf::traits_type::eof(): Menetapkan strim kepada keadaan eof jika baris tidak berakhir dengan baris baharu.
  • Lain-lain aksara: Menambahkan aksara pada rentetan.

Ujian Program

Contoh program ujian menunjukkan penggunaan fungsi 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;
}

Kesimpulan

Menggunakan fungsi safeGetline menghapuskan keperluan untuk pengendalian baris baharu secara manual dan memastikan pengambilan baris yang konsisten merentas konvensyen baris baharu yang berbeza. Pendekatan ini menyediakan penyelesaian yang teguh dan fleksibel untuk memproses fail teks yang berasal daripada pelbagai sumber.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Konvensyen Barisan Baharu Bercampur dalam C Menggunakan `std::ifstream`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn