我可以像C#中的"MemoryStream"那样使用字符串流作为内存流吗



在C/C++中,字符串以NULL结尾。

我可以像C#中的MemoryStream一样使用stringstream作为内存流吗?

内存流的数据可能在数据中间具有值,但C++字符串以NULL结尾。

std::string中存储字符序列时,可以包含空字符。相应地,std::stringstream也可以处理嵌入的空字符。然而,流上的各种格式化操作不会通过null字符。此外,当使用内置字符串为std::string赋值时,空字符将很重要,即,您需要使用以字符序列大小为参数的各种重载。

你到底想达到什么目的?可能有一种比在字符串流中旅行更容易的方法。例如,如果您想读取流接口以与内存缓冲区交互,那么自定义流缓冲区非常容易编写和设置:

struct membuf
: std::streambuf 
{
membuf(char* base, std::size_t size) {
this->setp(base, base + size);
this->setg(base, base, base + size);
}
std::size_t written() const { return this->pptr() - this->pbase(); }
std::size_t read() const    { return this->gptr() - this->eback(); }
};
int main() {
// obtain a buffer starting at base with size size
membuf       sbuf(base, size);
std::ostream out(&sbuf);
out.write("189", 6); // write three digits and three null chars
}

在C/C++中,字符串以NULL结尾。

  • 两种完全不同的语言(在语法上有一些共同点)。但C与C++的接近程度与Jave与C#的接近程度一样(因为它们不同)

每种语言都有自己的字符串特性。

  • C使用一个字节序列,按照惯例,该序列以"\0"字节结束。
    • 通常称为C字符串
    • 这个内存区域没有什么特别之处——它只是一个字节序列
    • 没有公约的执行,也没有标准的建设方式
    • 这是C程序中存在大量错误的地方
  • C++使用一个类(带方法)std::string

我可以像C#中的MemoryStream一样使用字符串流作为内存流吗?

当然。Memory流是由内存(而不是文件)支持的流。这正是std::stringstream。接口上有一些差异,但这些差异很小,使用文档应该可以很容易地解决任何混淆。

内存流的数据可能在数据中间有\0值,但C++字符串以NULL结尾。

这完全不正确。

  • C字符串被'\0'终止
  • C++std::字符串不以null结尾,并且可以包含任何字符

C和C++是两种不同的语言,在连续字符的C序列中表示字符串,您可以使用memcpy()memset()memcmp()将其视为可以设置/获取其值的内存部分。

在C++中,字符串是指一类信息,用来作为字符串获得正确的数据。因此,不能将其视为char类型的内存位置序列。

最新更新