2011-09-08 4 views
1

で生データを渡す私は(バッファからイメージをロード機能など)の機能にいくつかの生データを渡したい時はいつでも、私はこのような何かをするだろう:これまでC++

void Image::load(const char* buffer, std::size_t size); 

今日はproperty_tree/xml_parser.hppヘッダーで、より具体的には、Boostライブラリを見ていた、と私は、この関数のシグネチャに気づい:

template<typename Ptree> 
void read_xml(std::basic_istream<typename Ptree::key_type::value_type>&, 
       Ptree &, int = 0); 

これは実際に私は好奇心作られた:これはC++での生データの周りに渡すための正しい方法です、ストリームを使って?あるいは、私は関数が使われるはずのものを誤って解釈していますか?

前者の場合は、ストリームを使用する方法を学ぶことができるリソースを教えてください。私は自分自身(主にAPIリファレンス)を見つけられず、XMLパーサのBoostソースコードも見つけられませんでした。


編集:いくつかの余分な詳細

は、私が欲しいもののように、いくつかの混乱があっただようです。データバッファを指定すると、私は上記に投稿したread_xml関数と互換性があるようにストリームにどのように変換できますか?具体的な使用例は次のとおりです。

私はSevenZip C libraryを使用してアーカイブからXMLファイルを読み取ります。ライブラリは私にバッファとそのサイズを提供し、それをread_xmlと互換性があるようなストリーム形式にしたいと思います。どうやってやるの?

答えて

3

まあ、ストリームは非常にため、その利便性のC++で使用されています
-
エラー処理 - ファイルからの読み込みをしているかどうかようにカメラ、オーディオソース、データソースを離れて、彼らは抽象的、彼らはすべての入力が
ストリームとして扱わ - おそらく私はここで

を知らない多くの利点は、おそらくそれは、より良いあなたがストリームに何が起こっているか理解するのに役立つかもしれない、iostreamライブラリの概要は次のとおりです。 http://www.cplusplus.com/reference/iostream/

彼らは何を理解するいつどのように使用するのかを正確に理解するのに役立ちます。

0

これは基本的にストリームの内容を渡すためのリファレンスを使用しています。シーンの背後では、これまでのやり方と本質的に似ています。基本的には同じです。異なる表記を使用しています。簡略化されたリファレンスはポインタのアスペクトを隠すだけなので、あなたのboostサンプルでは、​​基本的にストリームへのポインタを使って作業しています。

参考文献はすべての参照/参照解除を避けているため、ほとんどの状況で扱いが容易です。しかし、彼らはあなたに複数レベルの(de-)参照を許可していません。

次の二つの例の機能は基本的に同じ操作を行います。

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

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

が渡されたデータそのものについて話す:それは本当にあなたが達成しようとしているものに依存し、より効果的なものです。文字列を変更したい場合は、クラス std::stringのオブジェクトを利用する方が、バッファへの古典的なポインタ( char *)を使うよりも便利です。ストリームは、複数の異なるもの(例えば、ネットワーク上のデータストリーム、圧縮ストリーム、または単にファイルまたはメモリストリーム)を表すことができるという利点を有する。この方法で、ストリームを入力として受け入れ、実際のストリームソースを心配することなく即座に機能する単一の関数またはメソッドを記述できます。古典的なバッファでこれを行うことは、より複雑になります。反対側では、すべてのオブジェクトがオーバーヘッドを追加することを忘れてはいけません。したがって、実行するジョブに応じて、文字列への単純なポインタが完全にうまくいくかもしれません(そして最も効果的な解決策)。 「それを行う方法」はありません。

+0

いいえ、私は参考文献とポインタを知っています。 _Streams_は、あなたがそれらと一緒にサイズを渡す必要がないので(より安全です)、裸のデータバッファと比較して優れています。私はそのようなデータストリームを作成する方法を知りたいですが、私はウェブ上のリソースを見つけていません。 –

+1

あなたはそれらのサイズをそれらに沿って渡します - 実際のデータ/コンテンツと共にオブジェクトの中に隠されているだけです。ポインタの長さだけでなく構造体もCで渡すことができます。独自のストリームを作成するには、あらかじめ定義されたストリームクラスのいずれかを使用するか、異なるメンバメソッドの独自のバージョンを実装する独自の派生クラスを作成します。 – Mario

1

C++でのロー・メモリーのバッファーは、unsigned char*のいずれかであるか、std::vector<unsigned char>を作成できます。 charは、標準ですべてのビットを1バイトで使用することが保証されていないため、通常はchar*をバッファに使用したくない(つまり、プラットフォーム/コンパイラによって異なる)。ストリームにはファイルやその他の入力からバイトを読み込むことができ、そこからバッファにそのデータを格納できることを考慮すると、ストリームにはいくつかの優れた用途もあります。

3

データバッファを渡す正しい方法はありません。ポインタと長さの組み合わせが最も基本的な方法です。それはCフレンドリーです。ストリームを渡すことで、シーケンシャル/チャンク処理が可能になる可能性があります。 e。ファイル全体を同時にメモリに格納しないでください。可変バッファを渡したい場合は、vector<char>&が適しています。

特にWindowsでは、HGLOBALまたはセクションオブジェクトハンドルが使用されます。

C++の考え方では、コンテキストや環境に応じて、さまざまなスタイルを明示的に使用できます。それに慣れる。

1

私が欲しいものについては混乱があるようです。データバッファが与えられたら、私は上記のread_xml関数と互換性があるようにストリームに変換する方法を教えてください。

istringstream stream(string(data, len)); 
read_xml(stream, ...); 

More on string streams here:簡単に(私はPTree::Key_type::value_typecharようなものになるだろう願っています)

関連する問題