SORU
22 EYLÜL 2008, PAZARTESİ


Bir std içine bir dosya içmek için en iyi yolu nedir::c dize ?

Nasıl bir içine bir dosya söylendi std::string, yani, dosyanın tamamını okuyun anda? Metin veya ikili mod arayan tarafından belirtilmelidir. Çözüm standart-uyumlu, taşınabilir ve verimli olmalıdır. Gereksiz dize veri kopyalamak değil, ve dize okurken bellek adetle sınırla kaçınmalıdır.

Bu filesize stat olurdu yapmanın bir yolu, yeniden boyutlandırma std::string std::stringfread()'const_cast<char*>()s'ed data(). Bu std::string'In standart tarafından gerekli değildir, ancak bilinen tüm uygulamalar için geçerli görünen bitişik veri gerektirir. Eğer dosya metin modunda std::string's boyutu, dosyanın boyutu eşit değil. okumak ise daha da kötüsü nedir,

Tamamen doğru, standartlara uygun ve taşınabilir çözümler std::ifstream13* *std::string içine oradan std::ostringstream ve. kullanarak inşa edilebilir Ancak, bu dize, veri ve/kopya veya gereksiz yere bellek ayrılacak. Tüm ilgili standart kütüphane uygulamaları tüm gereksiz yükü önlemek için yeterince akıllı? Bunu yapmak için başka bir yol var mı? Zaten istediğiniz işlevi sağlayan bazı gizli destek işlevi mi kaçırdım?

Nasıl öneri verebilir misiniz?

void slurp(std::string& data, bool is_binary)

dikkate alarak yukarıdaki tartışmayı.

CEVAP
22 EYLÜL 2008, PAZARTESİ


Ve en hızlı (biliyorum, bellek eşlenen dosyaları iskonto):

string str(static_cast<stringstream const&>(stringstream() << in.rdbuf()).str());

Bu dize akışı için 18 ** ek başlık gerektirir. (static_cast operator << düz ostream& eski döndürür ama gerçekte döküm güvenli stringstream& olduğunu bildiğimiz için gereklidir.)

Birden çok satıra bölmek, bir değişken geçici hareketli, daha okunabilir bir kod elde ederiz

string slurp(ifstream& in) {
    stringstream sstr;
    sstr << in.rdbuf();
    return sstr.str();
}

Ya da, bir kez daha tek satır:

string slurp(ifstream& in) {
    return static_cast<stringstream const&>(stringstream() << in.rdbuf()).str();
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • audivila

    audivila

    5 HAZİRAN 2009
  • Bratayley

    Bratayley

    30 Aralık 2010
  • TomKNJ

    TomKNJ

    26 ŞUBAT 2007