2013-04-08 18 views
5

C++'ların çoğuna oldukça aşinayım ama kaçındığım bir alan IO akışları oldu, çünkü temelde bunları gömülü sistemlerde kullanıyorum uygun değiller. Son zamanlarda onlara aşina olmak zorunda kaldım ve basit olması gerektiğini düşündüğüm bir şeyi anlamaya çalışıyorum.Belirli bir karakter sayısını C++ akışından std :: string'e okuma

Bir C++ akışından sabit sayıda karakterin std::string'a okunması için göreceli olarak verimli bir yöntem arıyorum. read() yöntemiyle geçici bir char dizisine kolayca okuyabilir ve bunu std::string içine dönüştürebilirdim, ancak bu oldukça çirkin ve savurgan bir kopyasını içeriyor. Ben de böyle bir şey ile bir diziden bir streamin tamamını okuyabilir:

std::string getFile(std::fstream &inFile) 
{ 
    std::stringstream buffer; 
    buffer << inFile.rdbuf(); 
    return buffer.str(); 
} 

... Ama belleğe okur sınırsız genellikle yoksul bir fikir, bu yüzden gerçekten dosyasını bir blok erişmek istediğiniz bir anda, 4K ya da öylesine. Aynı zamanda karakteri de okuyabiliyordum, ama bu sadece geçici bir char dizisine okumadan hem çirkin hem de daha az verimli hissediyor.

Yani, bir std::string doğrudan akışından sonraki N karakterleri içeren bir akıştan almak için basit bir yolu var mı? Bunu yapmanın hiçbir yolu yoktur, ama bana öyle geliyor ki böyle bir şey eksik olurdu, bu yüzden göze çarpan bir şey eksik olduğumu hissettim. Bu arada, C dosya IO API'lerine oldukça aşinayım ve bunları içeren bir çözüm aramıyorum. read() ve write() ile bir şeyleri çalabilirim, ancak çalıştığım kod akışları yoğun olarak kullanır ve kod eklemeleri tutarlı bir tarzda tutmak için iyi bir uygulama olduğunu düşünüyorum.

+0

Bkz. [This] (http://stackoverflow.com/questions/9521629/stdstringss-capacity-reserve-resize-functions) ve [this] (http://stackoverflow.com/questions/14286526/the-usage -de-stringreserve) de. –

cevap

8

Doğru yoldasınız. :)

mystring.resize(20); 
stream.read(&mystring[0], 20); 

Düzenleme: C++ 11

. bu iyi tanımlanmış ve güvenlidir. data() ve c_str(), std::string::operator[] 'un aksine, temel verilere bir mutable referansı sağlar.

C++ 03'te, pratik anlamda güvenlidir, ancak std::string'un tanımı bu güvenlik açısından garanti için çok zayıftı. C++03 allowed dizgi verileri bitişik olmamakla birlikte, mevcut herhangi bir uygulamanın bundan faydalandığına inanmıyorum.

+1

+1. Zor. Bu nasıl oldu da aklıma gelmedi! – Nawaz

+0

@Nawaz Benimkine gelince şok oldum. :) –

+0

Biliyorum * Bu tür zorlu fikirler akla geldiğinde ve hayatınızı kolaylaştığında! – Nawaz

İlgili konular