2011-07-20 19 views
5

Doğrudan bir ham bellek arabelleğinden okur bir istream oluşturmaya çalışıyorum.istream :: tellg(), özel streambuf sınıfımla kullanıldığında -1 değerini döndürür mü?

Ben burada başka bir yazı bunu yapmanın güzel bir yol bulmuş: Ben oluşturmak Sonra

class membuf : public basic_streambuf<char> 
    { 
    public: 
     membuf(char* p, size_t n) { 
      setg(p, p, p + n); 
     } 
    }; 

benim istream bu membuf kullanarak: Sonra getline() ve >> operatörlerini kullanarak okumak

membuf mb(dataPointer, dataLength); 
    istream reader(&mb); 

, ve her şey harika. Ancak, arabamın başına geri sarmak için seekg() kullanamıyorum ve istream::tellg() her zaman -1 döndürür.

Bunların çalışması için daha fazla kod yazmam gerekiyor mu, yoksa bu başarısızlığa mı yol açıyor?

+0

_know_ 'seekg()' geri sarmıyor musunuz? Tellg() 'nin düzgün çalıştığını kanıtladınız mı? –

+0

Evet, seekg (0) çağrıldıktan sonra getline() ilk satırımı okuyor. Tellg() işlevi, her zaman -1 değerini döndürdüğü için kesinlikle çalışmaz (arabamdan okumaya başladığımda bile). Bo'nun cevabının buraya gitmenin yolu olduğuna inanıyorum ... – EdSanville

+0

E @ dSanville: OK; Sorunuzu buna göre açıkladım. –

cevap

6

Tellg ve seekg işlevleri, membuf sınıfınızda uygulamanız gereken korunan sanal işlevlere (seekoff ve seekpos) bağlıdır.

basic_streambuf'daki varsayılan değerler, tüm çağrılar için pos_type(off_type(-1)) değerini döndürür (birçok uygulama için -1'e eşit olabilir).

+0

Çok teşekkür ederim! Bunları hemen uygulayacağım. Merak ediyorum da, istream :: tellg() bu fonksiyonları nasıl kullanıyor? Streambuf :: seekoff (0, ios_base :: cur) çağırır ve dönüş değerini alır mı? – EdSanville

+0

Aslında, evet. Aslında pubseekoff'u aradı, sonra seekoff diyor, ama bu bir arayüz tasarımı detayı. :-) –

+0

Bunu yapmaya çalışıyorum ... özel bir sınıfta 'seekoff' ve 'seekpos 'komutunu uygula, kodumda bir sorun var:' seekoff 'tellg' ve' seekpos tarafından sürekli olarak çağrılmıyor 'hiç çağrılmadı. Herhangi bir öneri veya çalışma örnekleri? –

İlgili konular