我可以在C#中使用stringstream作为内存流,如`MemoryStream`吗?

时间:2012-11-24 15:08:21

标签: c++ stringstream

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

我可以将stringstream用作C#中的MemoryStream内存流吗?

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

3 个答案:

答案 0 :(得分:8)

std::string中存储字符序列时,您可以包含空字符。相应地,std::stringstream也可以处理嵌入的空字符。但是,对流的各种格式化操作不会通过空字符。此外,当使用内置字符串为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("1\08\09\0", 6); // write three digits and three null chars
}

答案 1 :(得分:5)

  

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

  • 两种完全不同的语言(在语法上有一些共性)。但C与C ++差不多,就像Jave与C#一样(因为它们不同)。

每种语言都有自己的字符串功能。

  • C使用按照惯例以'\ 0'字节终止的字节序列。
    • 通常称为C-String。
    • 这个内存区域没什么特别的,它只是一个字节序列。
    • 没有强制执行,也没有标准的构建方式。
    • C程序中存在很大的漏洞。
  • C ++使用类(带方法)std :: string。
  

我可以在C#中使用stringstream作为MemoryStream等内存流吗?

不确定。内存流是由内存(而不是文件)支持的流。这正是std :: stringstream的意思。界面存在一些差异,但这些差异较小,使用文档应该可以轻松解决任何混淆。

  

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

这是完全错误的。

  • C-String被'\ 0'终止。
  • C ++ std :: string不会以空值终止,并且可以包含任何字符

答案 2 :(得分:1)

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

在C ++中,字符串表示用于将正确数据作为字符串获取的一类信息。因此,您无法将其视为具有char类型的内存位置序列。