Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Membaca Baris dengan Amanah daripada Fail dengan Pengakhiran Baris Campuran dalam C?

Bagaimanakah Saya Boleh Membaca Baris dengan Amanah daripada Fail dengan Pengakhiran Baris Campuran dalam C?

Linda Hamilton
Lepaskan: 2024-12-05 17:03:12
asal
254 orang telah melayarinya

How Can I Reliably Read Lines from a File with Mixed Line Endings in 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;
        }
    }
}
Salin selepas log masuk

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;
}
Salin selepas log masuk

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!

Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan