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

Ami*_*yan 9 c++ stringstream

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

我可以stringstreamMemoryStreamC#一样用作内存流吗?

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

Die*_*ühl 8

在a中存储字符序列时,std::string您可以包含空字符.相应地,a 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
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ork 5

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

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

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

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

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

当然.内存流是由内存(而不是文件)支持的流.这正是std :: stringstream的意思.界面有一些差异,但这些是次要的,使用文档应该可以轻松解决任何混淆.

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

这完全是错误的.

  • C-String被'\ 0'终止.
  • C++ std :: string不是以null结尾,可以包含任何字符