2014-08-31 123 views
2

如何有效地将数据从一个数据流插入另一个不同类型的数据流?在不同类型的数据流之间复制数据

我曾尝试以下:

#include <iostream> 
#include <sstream> 

using namespace std; 

int main(void) 
{ 
    basic_stringstream<unsigned short> uss; 
    stringstream cs; 

    unsigned short val = 0xffff; 

    uss.write(&val, 1);   // write value to 'uss' 

    uss.read(&val, 1);    // read data from 'uss' into 'val' 
    cout << hex << val << endl; // gives 0xffff 

    cs << uss.rdbuf();    // copy 'uss' contents into 'cs' 

    cs.read((char*) &val, 2);  // read data from 'cs' into 'val' 
    cout << hex << val << endl; // gives 0x3030 ? 

    return 0; 
} 
+0

http://stackoverflow.com/questions/5497284/is-it-ok-to-use-iostreams-with-int-as-character-type – 2014-08-31 23:45:15

+0

'cs << uss.rdbuf();'This line调用'operator <<(void *)',并在十六进制中打印指针,就像使用'printf(“%p”)''一样。我假设'rdbuf()'指针的地址是以十六进制呈现的形式'00XXXXXX',因此是0x3030(又名“00”)。 – 2014-08-31 23:54:33

回答

2

首先,如上所述in this question,你不能实例basic_string s,无写地狱大量自定义模板专门化与类型,如unsigned short流。

其次,这条线

cs << uss.rdbuf(); 

没有做什么,你认为它。 basic_ostreamoperator<<采用一个basic_streambuf

basic_ostream<charT,traits>& operator<< (basic_streambuf<char_type,traits>* sb); 

其中char_typecharT一个typedef。换句话说,字符类型必须匹配。

在你的情况下,它们不匹配,所以你最终调用operator<<(const void *)而不是打印出地址。当我在coliru上进行测试时,它会打印出7830而不是0x

相关问题