2011-09-20 19 views
5

kullanacak şekilde dönüştürme Bir dosya akışından veri okuyan C++ sınıflarım var. Fonksiyonlar böyle görünüyor.C++ dosya akışı işlevini bir stringstream

bool LoadFromFile(class ifstream &file); 

Dosya yerine bellekten okumak için yeni bir işlev oluşturuyorum. Bu yüzden etrafta dolaştım ve bir düsünce kodda herhangi bir değişiklik yapmadan hile yapmak gibi görünüyor.

bool LoadFromData(class istringstream &file); 

Şimdi sorum sorum. Bir char dizisinden okumak için bu akışı oluşturmam gerekiyor. Dize boş sonlandırılmadı, saf ikili veri ve boyutuna sahip bir tamsayı var. Bir dizgeye atamayı ve bir dizeden bir akış oluşturmayı denedim, ancak dize boş bir karakterden sonra sona erer .. ve veriler kopyalanır.

int size; 
char *data; 
string s = *data; 

nasıl işaretçi verilerin boyutunu belirterek + verileri kopyalamadan bir karakter dizisi pointer bir dize oluşturulur? Bir stringstream'den başka bir çözüm biliyor musunuz?

+1

Yani, açıklama: senin 'karakter *' boş sonlandırılmış olmadığını Sorununuz var mı ve bu nedenle sorun bunun dışında bir 'std :: string' inşa yaşıyorsanız) ... akışları? – quasiverse

+0

Evet, temelde sorun bu. Ayrıca, daha iyi bir çözümün olup olmadığını merak ediyorum. – Tito

+0

İşte çözüm şu olabilir: http://stackoverflow.com/questions/2079912/simpler-way-to-create-ac-memorystream-from-char-size-t-without-copying-th (bir sürüm Verileri kopyalar ve sadece gcc ile çalışır) –

cevap

4

Kendi basic_streambuf sınıf bir yaz tane! More details.. (Bu şekilde geçerli bellek üzerinde çalışabilirsiniz.)

İşaretçi ve boyuttan dize oluşturmak için: string str(data,data+size); (veriyi kopyalayacaktır). Şey daha

: Eğer işlevlerini yazarsın bundan istream dayalı için:

aiağıdakileri yapabileceği Bu şekilde
bool LoadFromStream(istream &is); 

, daha sonra bu fonksiyon aynı zamanda tcp destekler olabilir (istream dayalı hem istringstream ve ifstream çünkü

ifstream file; 
istringstream sstream; 

LoadFromStream(file); 
LoadFromStream(sstream); 
+0

Çok teşekkür ederim! Bu, fonksiyonları hiç değiştirmeden problemimi çözdü! – Tito

+0

Dosya akışları için çalışmış gibi görünüyor, ancak bir dize akışını ilettiğimde bu derleyici hatasını aldım (yukarıdaki kodla tam olarak). Araştırmak için elimden geleni yaptım ama anlamadım. VS'de derlenmiştir. 0 'parametresini' class std :: basic_istringstream , std :: allocator > 'dan' class istream & ' – Tito

+0

' a çeviremiyorum. Bool LoadFromStream (istream &is); 'yerine" bool LoadFromStream (istuse &is); "(sınıf istream &is);' sınıfı adında, genellikle namespace std; 'yi kullanarak kullanmıyorum) tanımını tanımlamanız gerekir: bool LoadFromStream (std :: istream &is); '. 'içermelidir. – Naszta