2011-09-20 55 views
5

我有大量的C++類從文件流中讀取數據。這些功能看起來像這樣。C++轉換文件流功能使用字符串流

bool LoadFromFile(class ifstream &file); 

我創建了一個新的函數來讀取內存而不是文件。所以我搜索了一下,一個istringstream似乎沒有任何修改代碼的伎倆。

bool LoadFromData(class istringstream &file); 

現在我的問題是。我需要構造這個流從char數組讀取。該字符串不是空終止的,它是純二進制數據,我得到了一個大小的整數。我試着將它分配給一個字符串並從一個字符串中創建一個流,但是字符串在空字符後終止..並且數據被複制。

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

如何從char數組指針創建字符串而不復制數據+指定指針數據的大小?你知道任何其他的解決方案,而不是一個stringstream嗎?

+1

因此,澄清:你的問題是你的'char *'不是空的終止,因此你無法構建一個'std :: string'嗎? – quasiverse

+0

是的,這基本上是問題。我也想知道是否有人知道更好的解決方案。 – Tito

+0

這裏也許是解決方案:http://stackoverflow.com/questions/2079912/simpler-way-to-create-ac-memorystream-from-char-size-t-without-copying-th(一個版本使用提升,在副本上的數據和一個只適用於gcc) –

回答

4

寫一個自己的basic_streambuf類! More details.。 (這樣你可以在當前內存上工作。)

從指針和大小創建字符串:string str(data,data+size);(它將複製數據)。

更多的事情:你應該重寫你的函數基於istream

bool LoadFromStream(istream &is); 

通過這種方式,你可以做以下,因爲這兩個istringstreamifstream基於istream(後來這個功能還可以支持TCP流......):

ifstream file; 
istringstream sstream; 

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

非常感謝!這解決了我的問題,根本不改變功能! – Tito

+0

似乎它適用於文件流,但是當我將一個字符串流傳遞給它時,我得到了這個編譯器錯誤(使用上面的確切代碼)。我盡力研究它,但我不明白。它在VS中編譯。 無法將參數1從'class std :: basic_istringstream ,class std :: allocator >'轉換爲'class istream&' – Tito

+0

我在很多地方都使用它。你應該定義爲'bool LoadFromStream(istream &is);'''''bool LoadFromStream(class istream &is);'在頭文件中我通常不使用'using namespace std;'所以定義是:'bool LoadFromStream(std :: istream &is);'應該包括''。 – Naszta