88 / 90

C++ Stream Buffer

C++ oqim buferlari (std::streambuf)

C++ da bufer - bu ma'lumotlarni qayta ishlash, faylga yozish yoki tarmoq orqali yuborishdan oldin vaqtincha saqlash uchun xotira maydoni.

Buferlar vositachi bo'lib xizmat qiladi va dastur ichida va tashqi qurilmalar o'rtasida uzluksiz ma'lumotlarni uzatishni osonlashtiradi.

Buferning ahamiyati

Samaradorlik

Buferlar tez-tez kiritish-chiqarish operatsiyalari uchun qo'shimcha xarajatlarni kamaytirishga yordam beradi. Bir vaqtning o'zida bir bayt ma'lumotni o'qish yoki yozish o'rniga (bu sekin bo'lishi mumkin), siz buferda saqlangan kattaroq ma'lumotlar bo'laklari bilan ishlashingiz mumkin.

I/U qo'ng'iroqlarini minimallashtirish

Buferlar o'qish va yozish operatsiyalari sonini kamaytiradi, bu odatda xotiradagi ma'lumotlar bilan ishlashdan ko'ra ko'proq vaqt talab qiladi.

Ma'lumotlar muvofiqligi

Buferlar ma'lumotlarning doimiy ravishda o'qilishi yoki yozilishini ta'minlaydi, xatolar ehtimolini kamaytiradi va kodingiz ishonchliligini oshiradi.

Resurslarni optimallashtirish

Buferlar dasturingizga tizim resurslaridan yaxshiroq foydalanish orqali kattaroq bloklarda ma'lumotlarni o'qish yoki yozish imkonini beradi.

Bufer yarating

Biz C++ da buferni oddiygina xotira ajratish orqali yaratishimiz mumkin:

example.cpp
char *buffer = new char buffer_name[buffer_size]

Bu yerga,

-*buffer - bufer manziliga ishora qiluvchi ko'rsatkich -buffer_name - bufer nomi -buffer_size - bufer hajmi

int yoki double kabi boshqa turdagi buferlardan ham foydalanishimiz mumkin. Biroq, char buferlari eng ko'p qo'llaniladi.

[!NOTE] Kelajakda foydalanish uchun joy bo'shatish uchun biz har doim buferni o'chirib tashlashimiz kerak. Buni delete[] yordamida amalga oshirishimiz mumkin

Misol: Bufer yarating

example.cpp
#include <iostream>
using namespace std;

int main() {

    // bufer hajmini aniqlang
    const int buffer_size = 1024; 
    
    // belgilar buferini e'lon qilish
    char *buffer = new char[buffer_size]; 

    // foydalanuvchini kiritishni so'rang
    cout << "Enter a line of text: ";

    // ma'lumotlarni buferga o'qish
    cin.getline(buffer, buffer_size);

    // buferdan o'qilgan tarkibni ko'rsatish
    cout << "You entered: " << buffer;
    
    // dinamik ravishda ajratilgan xotirani ajrating
    delete[] buffer;
    
    return 0;
}

Chiqish

kod
Enter a line of text: 12
You entered: 12

Bu erda biz foydalanuvchi tomonidan kiritilgan ma'lumotlarni saqlash uchun bufer yaratdik.

example.cpp
char *buffer = new char[buffer_size];

Buferni yaratishdan oldin biz bufer hajmini aniqlaganimizga e'tibor bering:

example.cpp
const int buffer_size = 1024;

Buning sababi, getline() funksiyasi uchun ajratuvchini ko'rsatish uchun bufer hajmini argument sifatida o'tkazishimiz kerak:

example.cpp
// ma'lumotlarni buferga o'qish
cin.getline(buffer, buffer_size);

[!NOTE] Biz getline(cin, buffer); o‘rniga cin.getline(buffer, buffer_size); dan foydalandik, chunki bufer satr o‘zgaruvchisi emas, balki belgilar ko‘rsatkichidir.

Bufer bilan ishlashni tugatgandan so'ng, biz uni darhol o'chirib tashladik.

Buferlarning turlari

C++ da buferlarning bir nechta turlari mavjud bo'lib, ularning har biri ma'lum bir maqsadga xizmat qiladi:

Oqim buferlari

Ular cin va cout kabi kirish va chiqish oqimlari bilan bog'langan. Oqim buferlari ma'lumotlarni ekranda ko'rsatilishi yoki faylga yozilishidan oldin vaqtincha saqlash uchun ishlatiladi.

Fayl buferlari

Ular fayllardan o'qish yoki fayllarga yozishda ishlatiladi. Fayl buferlari dasturingiz va fayl tizimi o'rtasida ma'lumotlarni uzatishni samarali boshqarishga yordam beradi.

Belgilar buferlari

Ko'pincha C uslubidagi satrlar deb ataladigan belgilar massivlarini belgilar ketma-ketligini saqlash uchun ishlatiladigan oddiy buferlar deb hisoblash mumkin.

Maxsus buferlar

std::vector yoki std::array kabi massivlar yoki maʼlumotlar tuzilmalaridan foydalanib, oʻzingizning maxsus buferlaringizni maxsus ehtiyojlaringizga mos ravishda yaratishingiz mumkin.