首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++中是否存在二进制内存流

C++中是否存在二进制内存流
EN

Stack Overflow用户
提问于 2009-10-13 10:01:33
回答 4查看 63.7K关注 0票数 70

我通常使用stringstream来写入内存中的字符串。有没有办法在二进制模式下写入字符缓冲区?考虑以下代码:

代码语言:javascript
复制
stringstream s;
s << 1 << 2 << 3;
const char* ch = s.str().c_str();

ch的内存将如下所示: 0x313233 -字符1、2和3的ASCII码。我正在寻找一种方法来写入二进制值本身。也就是说,我想要内存中的0x010203。问题是,我希望能够编写一个函数

代码语言:javascript
复制
void f(ostream& os)
{
    os << 1 << 2 << 3;
}

并在外部决定使用哪种流。如下所示:

代码语言:javascript
复制
mycharstream c;
c << 1 << 2 << 3; // c.data == 0x313233;
mybinstream b;
b << 1 << 2 << 3; // b.data == 0x010203;

有什么想法吗?

EN

回答 4

Stack Overflow用户

发布于 2009-10-13 11:14:30

要向流(包括字符串流)读写二进制数据,请使用read()和write()成员函数。所以

代码语言:javascript
复制
unsigned char a(1), b(2), c(3), d(4);
std::stringstream s;
s.write(reinterpret_cast<const char*>(&a), sizeof(unsigned char));
s.write(reinterpret_cast<const char*>(&b), sizeof(unsigned char));
s.write(reinterpret_cast<const char*>(&c), sizeof(unsigned char));
s.write(reinterpret_cast<const char*>(&d), sizeof(unsigned char));

s.read(reinterpret_cast<char*>(&v), sizeof(unsigned int)); 
std::cout << std::hex << v << "\n";

这在我的系统上提供了0x4030201

编辑:为了使用插入和提取操作符(<<和>>)透明地工作,您最好创建一个派生的streambuf来做正确的事情,并将其传递给您想要使用的任何流。

票数 44
EN

Stack Overflow用户

发布于 2018-02-06 20:24:33

你可以用模板来做这类事情。例如:

代码语言:javascript
复制
//struct to hold the value:
template<typename T> struct bits_t { T t; }; //no constructor necessary
//functions to infer type, construct bits_t with a member initialization list
//use a reference to avoid copying. The non-const version lets us extract too
template<typename T> bits_t<T&> bits(T &t) { return bits_t<T&>{t}; }
template<typename T> bits_t<const T&> bits(const T& t) { return bits_t<const T&>{t}; }
//insertion operator to call ::write() on whatever type of stream
template<typename S, typename T>
S& operator<<(S &s, bits_t<T> b) {
    return s.write((char*)&b.t, sizeof(T));
}
//extraction operator to call ::read(), require a non-const reference here
template<typename S, typename T>
S& operator>>(S& s, bits_t<T&> b) {
    return s.read((char*)&b.t, sizeof(T));
}

它可能需要一些清理,但它是有功能的。例如:

代码语言:javascript
复制
//writing
std::ofstream f = /*open a file*/;
int a = 5, b = -1, c = 123456;
f << bits(a) << bits(b) << bits(c);

//reading
std::ifstream f2 = /*open a file*/;
int a, b, c;
f >> bits(a) >> bits(b) >> bits(c);
票数 11
EN

Stack Overflow用户

发布于 2009-10-13 10:05:45

好吧,只使用字符,而不是整数。

代码语言:javascript
复制
s << char(1) << char(2) << char(3);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1559254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档