2010-11-19 8 views
1

私はlinuxのC++で作業しています。私はLinuxでC#のBinaryReaderとBinaryWriterの等価性があるのだろうか?C++のBinaryWriterとBinaryReader

ありがとうございました。

答えて

3

さて、あなたはプレーンなCのAPIを使用することができますバイナリファイルで作業したい場合(fopenを/関数fread/fwriteの/ fcloseを)または参照C++のライブラリ:入出力ストリームと標準iostreamの使用のための

1

チェックをFSTREAMクラスはfstreamです。 C APIの使用は残念ですが、それでも可能です。

2

iostreamライブラリがあります。

0

クイックアンサー:いいえ。

他の回答に応じて: 標準テンプレートライブラリはデータをストリームするためのクラスを提供しますが、データをシリアル化されたバイナリ形式に変換して元に戻すための高度な機能は提供しません。

< <と>>演算子は、明示的にそれらをサポートするように書かれたコードを持つクラスに対して動作します。しかしこれはBinaryWriterとBinaryReaderが行うことができますが、オブジェクトのグラフ全体をストリームし、循環参照を考慮に入れているわけではありません。.NETでは、各クラスに[Serializable]属性がありますそれらに適用されます。

C++とC#の違いについて考えると、完全なバイナリフォーマッタが提供されない理由を理解することができます。私が考えることができる問題は、

  • です。C++にはC#の反映機能がありません。
  • C++にはマネージメモリがないため、循環参照を考慮してオブジェクトグラフをストリーミングすることは不可能です。
+0

のstd::(I | O)ストリーム、バイトストリームです。オペレータ<< and >>は、関連する "toString reflection"です。 – Artyom

+0

@Artyom - std :: iostreamsはシリアル化されたデータをストリームする方法を提供します。これは、最初にオブジェクトグラフを直列化されたデータに変換することでは役に立ちません。 –

-1

C#と異なり、文字列は2バイトの「単語」のシーケンスで、UTF-16としてエンコードされます。 C++の文字列(std :: string)はバイトシーケンスであり、通常はシステムに応じてUTF-8や他のローカルエンコーディングでエンコードされます。

文字列を "バイトストリーム"に書き込むときに文字セット変換が行われないので、std :: fstreamのような通常のファイルストリームやstd :: stringstreadmのようなメモリ内ストリームはすべてstd :: ostreamから派生し、 /またはstd :: istreamであり、実際にはあなたが探しているバイトストリームです。

+1

C#バイナリフォーマッタは、文字列だけでなくオブジェクトもフォーマットできます。 –

+0

@Andrew Shepherd - ToString()を合理的な方法で実装していれば...同じように 'operator <<'が実装されていれば、どのC++オブジェクトもフォーマットできます。 – Artyom

0

1つのだけのライブラリを必要とする:あなたが得ることができるboost::serialization

3

最も近いofstreamifstreamクラスである:

// Write an integer, a double and a string to a binary file using ofstream 
std::ofstream out("out.data", std::ios_base::out | std::ios_base::binary); 
out << 10 << ' ' << 893.322 << ' ' << "hello, world" << std::endl; 
out.close(); 

// Read an integer, a double and a string from a binary file using ifstream: 
std::ifstream in("in.data", std::ios_base::in | std::ios_base::binary); 
int i = 0; 
double d = 0.0f; 
std::string s; 
in >> i; 
in >> d; 
in >> s; // reads up to a whitespace. 

// or you can read the entire file in one shot: 
std::stringstream buffer; 
buffer << in.rdbuf(); 
s = buffer.str(); // the entire file contents as an array of bytes. 

in.close(); 
+0

例えば、ほとんどの人がリンクを張ったときに+1。 –

+2

BinaryWriterなどはバイナリデータとしてデータを書きます。intを出力すると、intのバイトを取得します。これを文字列に変換します。 ios_base:バイナリは、行末の文字を変換しないようにストリームに指示しますが、元のポスターが望んでいるとは思っていません。 – jcoder

1

あなたはバイナリモードでのfstreamを開き、読み取りを使用する必要がありますし、バイナリの読み書きを実行するための関数を記述します。このような

何か -

#include <fstream> 
int main() 
{ 
    std::ofstream out("out.data", std::ios_base::out | std::ios_base::binary); 

    int a = 120; 
    out.write(reinterpret_cast<const char*>(&a), sizeof(int)); 
    out.close(); 
} 
関連する問題