Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mencipta Manipulator Strim Tersuai yang Mempengaruhi Output Seterusnya dalam C?

Bagaimana untuk Mencipta Manipulator Strim Tersuai yang Mempengaruhi Output Seterusnya dalam C?

Linda Hamilton
Lepaskan: 2024-11-06 15:23:02
asal
510 orang telah melayarinya

How to Create Custom Stream Manipulators that Affect Subsequent Outputs in C  ?

Manipulator Strim Tersuai untuk Mengubah Suai Output Seterusnya dalam C

Dalam C , manipulator strim ialah alatan berkuasa untuk menyesuaikan dan meningkatkan operasi input dan output. Satu manipulator biasa ialah std::hex, yang mengubah suai format keluaran angka berikutnya kepada perenambelasan.

Walau bagaimanapun, bagaimana jika anda memerlukan manipulator yang bukan sahaja menambah elemen tambahan pada strim tetapi juga mengubah suai nilai item yang datang selepas itu? Artikel ini meneroka cara mencipta manipulator sedemikian dan menunjukkan kes penggunaannya dengan contoh mudah.

Manipulator Tersuai dengan Storan Keadaan

Untuk mengubah suai item berikutnya pada strim, anda perlu menyimpan maklumat keadaan yang dikaitkan dengan setiap aliran. Ini boleh dicapai menggunakan fungsi ios_base::iword dan indeks yang dijana oleh xalloc.

inline int geti() {
    static int i = ios_base::xalloc();
    return i;
}
Salin selepas log masuk

Dengan mekanisme ini disediakan, anda boleh menentukan dua manipulator: add_one dan add_none. add_one menetapkan keadaan tersimpan kepada 1, manakala add_none menetapkannya kepada 0.

ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; }
ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }
Salin selepas log masuk

Menyesuaikan Output Numerik

Output angka dalam C dikendalikan mengikut faset. Untuk mengubah suai gelagat output berangka, anda boleh menentukan aspek tersuai. Di sini, kami mencipta aspek tersuai yang dipanggil my_num_put yang menambah setiap nilai angka dengan nilai keadaan yang disimpan.

struct my_num_put : num_put<char> {
    iter_type do_put(iter_type s, ios_base&amp; f, char_type fill, long v) const {
        return num_put<char>::do_put(s, f, fill, v + f.iword(geti()));
    }

    iter_type do_put(iter_type s, ios_base&amp; f, char_type fill, unsigned long v) const {
        return num_put<char>::do_put(s, f, fill, v + f.iword(geti()));
    }
};
Salin selepas log masuk

Menguji Manipulator

Untuk menguji manipulator tersuai, anda boleh menyerap aliran keluaran dengan aspek baharu dan menggunakan manipulator untuk mengubah suai output berangka.

int main() {
    // outputs: 11121011
    cout.imbue(locale(locale(), new my_num_put));
    cout << add_one << 10 << 11 << add_none << 10 << 11;
}
Salin selepas log masuk

Dalam contoh ini, aliran keluaran akan mencetak nombor 10, 11, 10 dan 11 dengan nilai 1 ditambahkan pada setiap dua nombor pertama, menghasilkan 11, 12, 10 dan 11.

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Manipulator Strim Tersuai yang Mempengaruhi Output Seterusnya dalam 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