在不同类型的流之间复制数据

时间:2014-08-31 22:55:47

标签: c++ iostream

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

我尝试了以下内容:

#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;
}

1 个答案:

答案 0 :(得分:2)

首先,如上所述in this question,您无法在不编写大量自定义模板专业化的情况下,使用basic_string等类型实例化unsigned short和流。

第二,这一行

cs << uss.rdbuf();

不符合您的想法。需要basic_ostream的{​​{1}} operator<<

basic_streambuf

其中basic_ostream<charT,traits>& operator<< (basic_streambuf<char_type,traits>* sb); char_type的typedef。换句话说,字符类型必须匹配。

在您的情况下,它们不匹配,因此您最终会调用charT,而只是打印出地址。当我在coliru上测试时,它会打印出operator<<(const void *)代替字符7830