0

ランダムアクセスファイルでデータを読み書きするためのC++アプリケーションを開発しました。(私はVisual C ++ 2010を使用しています)

これが私のプログラムです:

#include <iostream>
#include <fstream>
#include <string>


using namespace std;
class A
{
public :
    int a;
    string b;
    A(int num , string text)
    {
        a = num;
        b = text;
    }
};

int main()
{
    A myA(1,"Hello");
    A myA2(2,"test");

    cout << "Num: " << myA.a<<endl<<"Text: "<<myA.b<<endl;

    wofstream output; //I used wfstream , becuase I need to wite a unicode file
    output.open("12542.dat" , ios::binary );
    if(! output.fail())
    {
        output.write( (wchar_t *) &myA , sizeof(myA));
        cout << "writing done\n";
            output.close();

    }
    else
    {
        cout << "writing failed\n";
    }


    wifstream input;
    input.open("12542.dat" , ios::binary );
    if(! input.fail())
    {
    input.read( (wchar_t *) &myA2 , sizeof(myA2));
    cout << "Num2: " << myA2.a<<endl<<"Text2: "<<myA2.b<<endl;
    cout << "reading done\n";
    }

    else
    {
        cout << "reading failed\n";
    }

    cin.get();
}

そして出力は次のとおりです。

Num: 1
Text: Hello
writing done
Num2: 1
Text2: test
reading done

しかし、私は期待してい Text2: Helloます。何が問題ですか??

ちなみに、output.writeクラス内(関数内)ではどうすればよいですか?

ありがとう

4

1 に答える 1

1

AはPODではありません。非PODオブジェクトを残酷にキャストchar*してからストリームに書き込むことはできません。Aたとえば、次のようにシリアル化する必要があります。

class A
{
public :
    int a;
    wstring b;
    A(int num , wstring text)
    {
        a = num;
        b = text;
    }
};

std::wofstream& operator<<(std::wofstream& os, const A& a)
{
  os << a.a << " " << a.b;
  return os;
}

int main()
{
    A myA(1, L"Hello");
    A myA2(2, L"test");

    std::wcout << L"Num: " << myA.a<<endl<<L"Text: "<<myA.b<<endl;

    wofstream output; //I used wfstream , becuase I need to wite a unicode file
    output.open(L"c:\\temp\\12542.dat" , ios::binary );
    if(! output.fail())
    {
      output << myA;
      wcout << L"writing done\n";
      output.close();
    }
    else
    {
        wcout << "writing failed\n";
    }

    cin.get();
} 

このサンプルでは、​​オブジェクト myA をファイルにシリアライズします。これを読み取る方法を考えることができます。

于 2013-01-18T07:09:36.987 に答える