Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Mencipta Manipulator Strim Tersuai yang Mempengaruhi Output Seterusnya dalam 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; }
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; }
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& 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& f, char_type fill, unsigned long v) const { return num_put<char>::do_put(s, f, fill, v + f.iword(geti())); } };
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; }
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!