2011-09-20 12 views
5

Mam wiele klas C++, które odczytują dane ze strumienia plików. Funkcje wyglądają tak.C++ konwertowanie funkcji strumienia plików na strumień łańcuchowy

bool LoadFromFile(class ifstream &file); 

Tworzę nową funkcję do odczytu z pamięci zamiast z pliku. Więc szukałem informacji w Google i wydaje mi się, że istringstream robi to bez żadnych modyfikacji kodu.

bool LoadFromData(class istringstream &file); 

Teraz moje pytanie jest. Muszę skonstruować ten strumień, aby odczytać z tablicy znaków. Łańcuch nie jest zakończony znakiem NUL, to czyste dane binarne i mam liczbę całkowitą o rozmiarze. Próbowałem przypisać go do napisu i utworzyć strumień z łańcucha, jednak ciąg znaków kończy się po znaku pustym .. i dane są kopiowane.

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

Jak utworzyć ciąg znaków ze wskaźnika tablicy znaków bez kopiowania danych + określając rozmiar danych wskaźnika? Czy znasz jakieś inne rozwiązanie niż stringstream?

+1

Wyjaśnienie: Czy Twój problem polegał na tym, że twój znak "char *" nie ma wartości null, a zatem masz problem z skonstruowaniem 'std :: string' z tego? – quasiverse

+0

Tak, to jest podstawowy problem. Zastanawiam się też, czy ktoś wie lepsze rozwiązanie. – Tito

+0

Oto możliwe rozwiązanie: http://stackoverflow.com/questions/2079912/simpler-way-to-create-ac-memorystream- from-char-size-t- without -copying-th (jedna wersja używa doładowania, na kopiach danych i jeden działa tylko z gcc) –

Odpowiedz

4

Napisz własną klasę ! More details.. (W ten sposób można pracować z bieżącą pamięcią.)

Aby utworzyć ciąg ze wskaźnika i rozmiaru: string str(data,data+size); (skopiuje dane).

On jeszcze jedno: należy przepisać swoje funkcje na podstawie istream:

bool LoadFromStream(istream &is); 

W ten sposób można wykonać następujące czynności, ponieważ zarówno istringstream i ifstream oparciu o istream (później ta funkcja może również obsługuje tcp strumienie ...):

+0

Dziękuję bardzo! To rozwiązało mój problem bez zmiany funkcji! – Tito

+0

Wygląda na to, że zadziałało dla strumieni plików, ale kiedy przekazałem do niego strumień, otrzymałem ten błąd kompilatora (z dokładnym kodem powyżej). Zrobiłem co w mojej mocy, aby to zbadać, ale po prostu tego nie rozumiem. Jest skompilowany w VS. Nie można przekonwertować parametru 1 z 'class std :: basic_istringstream , class std :: allocator >' do 'klasy istream &' – Tito

+0

Używam go w wielu miejscach. Powinieneś zdefiniować jako 'bool LoadFromStream (istream &is);' przeciw 'bool LoadFromStream (klasa istream &is);' W pliku nagłówkowym zwykle nie używam 'using namespace std;' więc definicja to: 'bool LoadFromStream (std :: istream &is);'. powinien zawierać ''. – Naszta

Powiązane problemy