Akış tamponlar giriş veya çıkış aygıtlarını temsil eden ve Bu cihaza formatlanmamış I/O için düşük seviyeli bir arayüz sağlar. Diğer taraftan akışlar, temel biçimlendirilmemiş I/O fonksiyonları aracılığıyla ve özellikle formatlanmış I/O fonksiyonları aracılığıyla (yani, operator<<
ve operator>>
aşırı yükler) tampon etrafında daha yüksek seviyeli bir sarmalayıcı sağlar. Akış nesneleri ayrıca bir akım arabelleğin ömrünü de yönetebilir. Örneğin bir dosya akışında bir dahili dosya akışı tamponu vardır. Akış, arabelleğin ömrünü yönetir ve arabellek, bir dosyaya gerçek okuma ve yazma özelliklerini sağlayan şeydir. Akışın biçimlendirme operatörleri, sonuç olarak akış arabelleğin biçimlendirilmemiş I/O işlevlerine erişir, böylece yalnızca akımın G/Ç işlevlerini kullanmanız ve doğrudan arabellek G/Ç işlevlerine dokunmanız gerekmez.
Farklılıkları anlamanın başka bir yolu da, yerel nesneleri oluşturdukları farklı kullanımlara bakmaktır. Akımlar, numpunct
ve num_get
gibi biçimlendirmeyle ilgili olan yüzleri kullanır. Ayrıca, özel zaman veya para veri türleri için operator<<
ve operator>>
akışlarının aşırı yüklenmesinin zaman ve para biçimlendirme özelliklerini kullanmasını bekleyebilirsiniz. Bununla birlikte, akım arabellekleri, arabirim kullandıkları birimler ile baytlar arasında dönüştürme yapmak için codecvt yönlerini kullanırlar. Örneğin, basic_streambuf<char16_t>
arabirimi, char16_t
ve basic_streambuf<char16_t>
öğelerini, temel olarak, yazılı aygıta yazılan birimlerin arabelleğe yazılan birimlerine dönüştürmek için codecvt<char16_t, char, mbstate_t>
'u kullanır. Bu nedenle, akışların çoğunlukla biçimlendirme için olduğunu ve akış tamponlarının biçimlendirilmemiş giriş veya çıkış için farklı bir harici kodlama kullanabilen cihazlara düşük düzeyli bir arabirim sağladığını görebilirsiniz.
Bir G/Ç aygıtına yalnızca biçimlenmemiş erişim istediğinizde bir akış arabelleği kullanabilirsiniz. Akış arabelleğini paylaşan birden çok akış kurmak istiyorsanız, akış arabelleklerini de kullanabilirsiniz (yine de arabelleğin ömrünü dikkatli bir şekilde yönetmeniz gerekir). Ayrıca, geniş bir karakter akışı arabelleği gibi görünmesini sağlamak için, basic_streambuf<char>
için bir cephe işlevi gören C++ 11'deki wbuffer_convert
gibi kullanmak isteyebileceğiniz özel amaçlı akış arabellekleri de vardır. Herhangi bir yerel ortama eklenmiş codecvt faseti kullanmak yerine oluşturduğu codecvt fasetini kullanır. Genellikle, aynı etkiye, uygun yüzeye sahip bir yerle aşılanmış geniş bir akış tamponu kullanarak ulaşabilirsin.
Akış arabelleğinin kötü bir şekilde soyutlanması. – Pubby
@Pubby: Er, "akış tamponu" nedir? Bir akıştan mı yoksa bir tampondan nasıl farklıdır? – Mehrdad
Anladığım kadarıyla, bir akış in/output'u biçimlendirir ve arabelleğinde saklar. – Pubby