C++ 在C+中传递原始数据+;

C++ 在C+中传递原始数据+;,c++,stream,C++,Stream,到目前为止,每当我想将一些原始数据传递给函数(比如从缓冲区加载图像的函数),我都会这样做: void Image::load(const char* buffer, std::size_t size); 今天,我看了一下Boost库,更具体地说是页眉,我注意到这个函数签名: template<typename Ptree> void read_xml(std::basic_istream<typename Ptree::key_type::value_type>&

到目前为止,每当我想将一些原始数据传递给函数(比如从缓冲区加载图像的函数),我都会这样做:

void Image::load(const char* buffer, std::size_t size);
今天,我看了一下Boost库,更具体地说是页眉,我注意到这个函数签名:

 template<typename Ptree> 
 void read_xml(std::basic_istream<typename Ptree::key_type::value_type>&, 
               Ptree &, int = 0);
模板
void read_xml(std::basic_istream&,
p树&,int=0);
<>这实际上让我好奇:这是通过C++来传递C++中的原始数据的正确方法吗?还是我误解了函数的用途

如果是前者,你能给我指一些我可以学习如何使用流的资源吗?我自己也没有找到太多(主要是API引用),也没有找到XML解析器的Boost源代码


编辑:一些额外的细节

我想要什么似乎有些困惑。给定一个数据缓冲区,如何将其转换为流,使其与我上面发布的
read\uxml
函数兼容?以下是我的具体用例:


我正在使用从存档中读取XML文件。库将为我提供一个缓冲区及其大小,我希望将其设置为流格式,以便它与
read\u xml
兼容。我该怎么做

这本质上是使用引用来传递流内容。所以在场景的背后,它本质上与你到目前为止所做的非常相似,本质上是一样的——只是使用了不同的符号。简化后,引用只是隐藏了指针方面,因此在boost示例中,您实际上是在使用指向流的指针

引用具有避免所有引用/取消引用的优势,因此在大多数情况下更易于处理。但是,它们不允许您进行多级(取消)引用

以下两个示例函数的作用基本相同:

void change_a(int &var, myclass &cls)
{
    var = cls.convert();
}

void change_b(int *var, myclass *cls)
{
    *var = cls->convert();
}

谈论传递的数据本身:这实际上取决于您试图实现什么以及什么更有效。如果要修改字符串,使用类为
std::string
的对象可能比使用指向缓冲区的经典指针(
char*
)更方便。流的优点是它们可以表示几种不同的东西(例如网络上的数据流、压缩流或简单的文件或内存流)。通过这种方式,您可以编写单个函数或方法来接受流作为输入,并且可以立即工作,而不必担心实际的流源。使用经典缓冲区执行此操作可能更复杂。另一方面,您不应该忘记,所有对象都会增加一些开销,因此根据要完成的工作,一个简单的字符串指针可能非常好(也是最有效的解决方案)。没有一种方法可以做到这一点。

< P>,流在C++中被广泛使用,因为它们的便利性:
-错误处理
-它们将数据源抽象出来,因此无论您是从文件、音频源还是相机中读取,它们都被视为输入流
-可能还有更多我不知道的优点

以下是IOstream库的概述,或许可以更好地帮助您了解流的情况:


理解它们是什么,将有助于你理解如何使用它们。

< P> C++中的原始内存缓冲区可以是“代码>未签名CHAR*<代码>,或者可以创建<代码> STD::vector < /代码>。您通常不希望只使用
char*
作为缓冲区,因为标准不保证
char
使用单个字节中的所有位(即,这将因平台/编译器而异)。也就是说,流也有一些很好的用途,考虑到您可以使用流从文件或其他输入中读取字节,然后从中将数据存储在缓冲区中。

没有一种正确的方法来传递数据缓冲区。指针和长度的组合是最基本的方式;它是C友好的。传递流可能允许顺序/分块处理-i。E不同时将整个文件存储在内存中。如果您想传递一个可变缓冲区(可能会增长),那么
向量&
将是一个不错的选择

特别是在Windows上,可能会使用HGLOBAL或section对象句柄

< C++哲学明确地允许了许多不同的风格,这取决于上下文和环境。习惯它

我想要什么似乎有些困惑。给定一个数据缓冲区,如何将其转换为流,使其与上面发布的read_xml函数兼容

很容易(我希望
PTree::Key\u type::value\u type
类似于
char
):


.

不,我知道引用和指针。与裸数据缓冲区相比,流似乎更好,因为您不必同时传递它们的大小(它们更安全)。我想知道如何创建这样的数据流,但我在网上没有找到任何资源。你可以通过它们传递它们的大小-它只是隐藏在对象中,只有真实的数据/内容。在C中也可以使用指针和长度传递结构。要创建自己的流,请使用预定义的流类之一,或者创建自己的派生类,实现不同成员方法的自己版本。
istringstream stream(string(data, len));
read_xml(stream, ...);