2010-10-31 43 views
1

目前,我有一個名爲Data的字符串流。我要求的字符串流的開始使用:Stringstream write()問題,同時「覆蓋」

Data.seekp(0, std::ios::beg); 

於是,我試着寫2個整數的前8個字節的字符串流(以前,前8個字節被設置爲0)

Data.write(reinterpret_cast<char*>(&dataLength),sizeof(int)); 
Data.write(reinterpret_cast<char*>(&dataFlags),sizeof(int)); 

使用Visual C++調試器,當我設置一個斷點時,我可以看到dataLength等於12,而dataFlags等於0,因此它應該分別寫入12和0。

寫完2個整數後,它似乎沒有效果。然後,我用下面的代碼打印我的stringstream的數據:

char* b = const_cast<char*>(Data.str().c_str()); 
for (int i = 0; i < dataLength; i++) 
{ 
    printf("%02X ",(unsigned char)b[i]); 
} 

我可以看到,前8個字節我的數據仍然是0的,即使我只是覆蓋了前12個字節與兩個整數(其中第一個整數! = 0)。

爲什麼我的stringstream中的數據不能被正確覆蓋?

回答

2
char* b = const_cast<char*>(Data.str().c_str()); 

Data.str()是一個臨時的,它在此語句結束時被銷燬;臨時的c_str()的值只能在臨時存在的時候使用(並且你沒有對其進行修改,失效規則對於std :: string是複雜的)。沒有未定義的行爲,你永遠不能使用b。

std::string b = Data.str(); 
for (int i = 0; i < b.size(); i++) { 
    printf("%02X ", (unsigned char) b[i]); 
} 
+0

謝謝:)工作很棒! – Brad 2010-10-31 04:32:04

0

我假設你真的想將字符串「12」寫入到字符串流中。您不能通過將int轉換爲char*來將int12轉換爲char*。也就是說,我認爲你可能是不正確的這部分:

reinterpret_cast<char*>(&dataLength) 

如果數據長度確實是一個int,這不是把它變成一個char*的正確方法。也許這個:

Data << dataLength << dataFlags; 

我希望我沒有完全誤解你想達到的目標。

+1

我想寫整數(構成整數的二進制)到字符串流。 char *只是將int *轉換爲char *,所以我可以正確地將它寫入到字符串流中。但是寫整數似乎沒有效果。我沒有試圖將整數轉換爲字符串,但我只是想寫整數。 – Brad 2010-10-31 04:18:51