2009-09-04 26 views
3

これはC++に関する質問です。私は、文字列を含むクラスがあります。文字列をバイナリとしてファイルに書き込む方法は?

class MyClass{ 
public: 
std::string s; 
}; 

をそして私はMyClassのオブジェクトの配列を持っている:

MyClass * array = MyClass[3]; 

は今、私は、ファイルにバイナリとして配列を書きたいです。私は使用できません:

Ofstream.write((char *)array, 3 * sizeof(MyClass)) 

MyClassのサイズが異なるためです。

Ofstream.writeを使用して目的を達成するにはどうすればよいですか?どうもありがとう。

答えて

4

ostream& operator << (ostream& output, const MyClass& myClass) 
{ 
    return output << myClass.Value; 
} 

あなたは、単に直接ファイルストリームにはMyClassのうち文字列をシリアライズすることができますC++では通常、次のようにして行われます。BOOST serialization class

プログラムでは、次のようにすることができます。

執筆:あなたのクラスの

 
std::ifstream istream("myclass.bin",std::ios::binary); 
if (!istream) return; // error! 
std::size_t array_size = 0; 
istream.read(reinterpret_cast<char*>(&array_size),sizeof(std::size_t)); 
array = new MyClass[array_size]; 
for(MyClass* it = array; it != array + array_size; ++it) 
{ 
    MyClass& mc = *it; 
    std::size_t s; 
    istream.read(reinterpret_cast<char*>(&s),sizeof(std::size_t)); 
    mc.resize(s); 
    istream.read(mc.s.c_str(),s.size()); 
} 
istream.close(); // not needed as should close magically due to scope 
+0

"for mc:0 ... array_size" 疑似コード、C++ 0xまたはtypoですか? –

+0

構文が2つの例で異なることを考慮すると、擬似コードでなければなりません。 – MSalters

+6

私は擬似コードがより一般的であると思っていましたが、C++に特化したものに戻しました。 –

-1

オープンバイナリモードでストリーム:

std::fstream filestream("file.name", std::ios::out | std::ios::binary); 
1

はストリーム1つずつ、そのメンバーを書き出すこと、thisのように、MyClassのためinsertion operatorを書きます。次に、あなたの配列を歩くループを作り、各メンバーをストリームに書き出します。ある時点で配列サイズを書き出すことを覚えておいて、ファイルを読み込んだときに読み込むメンバー数を知ることができます。

そして、Klaimの言うとおり、ストリームをバイナリモードで開くようにしてください。

1

これを行うには良い方法はMyClassため<<演算子をオーバーライドするために、次のようになります。

std::fstream fileStream("output", std::ios::out|std::ios::binary); 

for (int i = 0; i < 3; ++i) 
    fstream << array[i]; 
3

過負荷operator<<を読む

 
std::ofstream ostream("myclass.bin",std::ios::binary); 
if (!ostream) return; // error! 
std::size_t array_size = 3; 
ostream.write(reinterpret_cast<char*>(&array_size),sizeof(std::size_t)); 
for(MyClass* it = array; it != array + array_size; ++it) 
{ 
    MyClass& mc = *it; 
    std::size_t s = mc.s.size(); 
    ostream.write(reinterpret_cast<char*>(&s),sizeof(std::size_t)); 
    ostream.write(mc.s.c_str(),s.size()); 
} 

ostream& operator<< (ostream& os, const MyClass& mc) 
{ 
    return os << mc.s /* << ... other members*/ << endl; 
} 
+0

演算子>>を定義することをお勧めします。 – Bill

1

正確にファイルに書き込もうとしているものは何ですか? C++では、Cのようにオブジェクトの内容を前提にすることはできません。std :: stringは、通常、ポインタ、アロケータ、文字列の長さ、および/または最初の数文字を保持します。 string :: data()から得られるchar []全体を保持しているわけではありません。 std :: string [3]がある場合、3つのsring :: data()配列は(ほぼ確実に)連続しないので、3つの書き込みが必要です。

関連する問題