2010-05-18 58 views
0

我在Windows XP和Visual Studio中用C++語言編寫了一個應用程序。如何將內存塊的指針轉換爲std流

在那個應用程序中,我使用LoadResource()API來加載用於在資源內存中提供文件的資源。

它返回了一個內存塊的指針,我想將指針轉換爲標準流以用於兼容性。

任何人都可以幫助我嗎?

+1

也許你應該'accept'一些答案,詢問更多的問題之前, ? – ereOn 2010-05-18 09:40:29

+1

另外,提供一個關於你已經做的代碼示例可能是一個好主意。 – ereOn 2010-05-18 09:42:04

+0

我只是一個初學者,我的朋友不是專業人士。 但tanx給你評論。 – 2010-05-18 10:08:23

回答

1

爲什麼你需要這個?將原始數據指針轉換爲數據流意味着對您的資源進行逐字節複製,因此缺乏性能(另外值得一提的是,在這種方法中我看不到任何好處)。

如果您想使用原始內存,請使用原始內存。在這裏施放(兼容性?)似乎是一種非常奇怪的方法。

不過,如果你想這樣做,你可以從你的內存塊創建一些流,將它視爲一個字節序列。在這種情況下,這意味着使用std::stringstreamistringstream)。

通過LockResource鎖定資源後,從收到的void*指針創建一個字符串,並將其傳遞給您的stringstream實例。

void* memory = LockResource(...); 
// You would probably want to use SizeofResource() here 
size_t memory_size = ... ; 
std::string casted_memory(static_cast<char*>(memory), memory_size); 
std::istringstream stream(casted_memory); 
0

最直接的方法可能是緩衝區轉換爲string,然後stringstream

std::stringstream ss(std::string(buf,len)); 

我認爲會複製它的兩倍,雖然如此,如果它真可謂是走了不少的時間,你也許需要尋找替代品。你可以使用strstream,但它可能嚇壞了廣場。

2

不能的資源流的類型。要麼你複製字節:

std::stringstream ss; 
ss.rdbuf().sputn(buf, len); 

,或者你換你的資源在自己的流緩衝:

class resourcebuf : public std::streambuf { 
    // Todo: implement members including at least xsgetn, uflow and underflow 
}; 

,並把它傳遞給istream::istream

+0

+1,非常喜歡你的方法 – 2010-05-19 21:31:29

相關問題