2013-01-03 121 views
0

我會試着再次問這個問題,但比上次更好。在C++中創建一個iostream對象

我有一個程序從各個地方讀取二進制數據,然後在我編寫的類中對其進行處理。數據將從源代碼中讀取(可能會有所不同),然後寫入流中,並將該流傳遞到類中以供類處理。

我的努力與搞清楚如何創建iostream並寫入/讀取它。我曾在不同的地方看過,並在cplusplus.com上閱讀過參考文獻,但我找不到一個簡單的例子來說明如何創建iostream

根據我讀過,這裏是我的嘗試:

#include <iostream> 


using namespace std; 

int main(){ 
    streambuf* sb; 
    iostream s(sb); 

    s.put('h'); //segfault 
} 

坦率地說,我不知道爲什麼它的段錯誤,或如何解決它,所以我要求別人來告訴我如何正確地創建一個iostream對象,最終,我將能夠執行類似下面的:

void printByN(iostream s, n){ 
    while (s.peek() != eof()){ // I'm not sure this is correct. need help with that too 
     char buf [n]; 
     s.read(&buf, n); 
     cout << buf << endl; 
    } 
} 

int main(){ 
    //create iostream s; 
    char* buf = "hello there my friend"; 
    s.write(buf, strlen(buf)); 
} 

關鍵是我需要的數據流知道什麼時候是空的,並且在返回一個特殊值那一點。我無法使用stringstream,因爲二進制數據可能包含空字符,而這些字符並不意味着要終止數據。

如果iostream是這樣做的錯誤方法,請讓我知道一個更好的選項。

+4

我會推薦一個[體面的介紹性C++書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list),而不是試圖學習語言從隨機網站劃傷。你應該有更大的成功! –

+0

你是對的,這是一個假設,所以很抱歉。但上面的代碼似乎有基本的錯誤,比如將未初始化的指針作爲參數傳遞給構造函數... –

回答

5

stringstream正是你想要的。 C++字符串可以包含嵌入的空字符(\0)。如果你不相信我,try it

iostream確實是一個抽象的基類,它本身沒有真正的功能。您不應直接創建iostream的實例。

+0

你說得對。 null字符的問題不在於'stringstream'認爲它是在它的末尾,而是'while(s.peek())'的測試工作不正常。你能推薦正確的方法來執行這個測試嗎? – ewok

+0

@ewok我會建議'while(s.peek()!= EOF)'。您也可以在peek操作之後測試's.eof()'或's.bad()'等以獲取更具體的信息。 – cdhowie

+0

它告訴我'EOF'沒有被聲明。並且使用's.eof()'永遠不會結束。 – ewok