Rumah > pembangunan bahagian belakang > C++ > Bagaimana Mengendalikan Penghujung Baris Berbeza dengan Anggun dalam `std::getline` C?

Bagaimana Mengendalikan Penghujung Baris Berbeza dengan Anggun dalam `std::getline` C?

Patricia Arquette
Lepaskan: 2024-12-08 07:59:10
asal
805 orang telah melayarinya

How to Gracefully Handle Different Line Endings in C  's `std::getline`?

Mengendalikan Penghujung Baris Berbeza dengan Anggun dalam std::istream::getline

Apabila membaca fail teks, menghadapi penghujung baris yang berbeza-beza seperti 'n ', 'r', dan 'rn' boleh menimbulkan cabaran. std::getline ialah fungsi yang mudah untuk mendapatkan semula baris daripada aliran input, tetapi ia mungkin meninggalkan aksara 'r' baki di hujung rentetan.

Seperti yang ditunjukkan oleh Neil, masa jalan C biasanya dilengkapi untuk mengendalikan konvensyen penamat talian berdasarkan platform. Walau bagaimanapun, kebolehoperasian antara sistem yang berbeza memerlukan pendekatan yang lebih mantap.

Berikut ialah fungsi tersuai yang memproses ketiga-tiga jenis penamat baris dengan lancar:

std::istream& safeGetline(std::istream& is, std::string& t)
{
    t.clear();

    std::istream::sentry se(is, true);
    std::streambuf* sb = is.rdbuf();

    for(;;) {
        int c = sb->sbumpc();
        switch (c) {
        case '\n':
            return is;
        case '\r':
            if(sb->sgetc() == '\n')
                sb->sbumpc();
            return is;
        case std::streambuf::traits_type::eof():
            if(t.empty())
                is.setstate(std::ios::eofbit);
            return is;
        default:
            t += (char)c;
        }
    }
}
Salin selepas log masuk

Dalam fungsi ini, kami menggunakan objek streambuf untuk membaca aksara satu persatu dengan cekap. Setiap watak diperiksa dan berdasarkan jenisnya, tindakan yang sesuai diambil untuk mengendalikan pengakhiran baris.

Satu program ujian menggambarkan penggunaan safeGetline:

int main()
{
    std::string path = ... // Insert path to test file here

    std::ifstream ifs(path.c_str());
    if(!ifs) {
        std::cout << "Failed to open the file." << std::endl;
        return EXIT_FAILURE;
    }

    int n = 0;
    std::string t;
    while(!safeGetline(ifs, t).eof())
        ++n;
    std::cout << "The file contains " << n << " lines." << std::endl;
    return EXIT_SUCCESS;
}
Salin selepas log masuk

Dengan menggunakan pendekatan ini, anda boleh membaca fail teks daripada pelbagai asal usul dengan yakin, memastikan pengendalian pengakhiran baris yang berbeza dengan anggun.

Atas ialah kandungan terperinci Bagaimana Mengendalikan Penghujung Baris Berbeza dengan Anggun dalam `std::getline` C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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