2011-11-14 34 views
55

G/Ç akışlarının C++'da nasıl çalıştığı hakkında biraz daha fazla şey öğrenmeye çalışıyorum ve ne zaman kullanacağım konusunda gerçekten kafam karışık.Streambuf tam olarak nedir? Bunu nasıl kullanabilirim?

Tam olarak ne streambuf nedir?
, string, istream veya vector ile karşılaştırıldığında ne zaman kullanılır? (Zaten son üç biliyorum ama hiç yaparsa streambuf, onlara karşılaştırır değil nasıl.)

+0

Akış arabelleğinin kötü bir şekilde soyutlanması. – Pubby

+1

@Pubby: Er, "akış tamponu" nedir? Bir akıştan mı yoksa bir tampondan nasıl farklıdır? – Mehrdad

+0

Anladığım kadarıyla, bir akış in/output'u biçimlendirir ve arabelleğinde saklar. – Pubby

cevap

38

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.

+3

Bu 5 yıl çok geç, bu yüzden bunu bir cevap olarak yayınlamayacağım ve bunu kabul etmeyeceğim, fakat bunu okuduktan sonra bile terminolojinin kafası karışmış olanlar için: "streambuf", ** raw ** için veri (örn. ham bayt, ham inters, vs.), “stream” ise ** pişmiş ** veri (metin, metin olarak biçimlendirilmiş tamsayılar, vb.) içindir. Başka bir deyişle, 'stream' ** parsing ** (veya serialization) katmanını temsil eder. Düz dizelerle uğraşırken, teknik olarak da kullanabilirsiniz, ancak anlam farklıdır: "streambuf", ham verilerin dizenin kendisi olmasını istediğiniz anlamına gelir, "stream" ise kodlamayı ortadan kaldırır. – Mehrdad

46

streambuf yardımıyla, biz daha düşük düzeyde çalışabilirler. Alttaki tamponlara erişim sağlar.

enter image description here

fazla ayrıntı için bu bakın, Copy, load, redirect and tee using C++ streambufs ve karşılaştırma atıfla, bu yararlı olabilir: Burada

bazı iyi örneklerdir IOstream Library

+3

+1 harika bir makaleye işaret ediyor. – jweyrich

+1

Streambuf'un yanı sıra bu makaleyi açıklayabilecek bir şey için her yeri aradım. Bulmama yardım ettiğin için teşekkürler! – wvdschel