depurar string de leitura / gravação em arquivo binário

Estou tentando gravar em um arquivo binário, aqui está meu trecho de código

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

using namespace std;

struct user
{
    string ID;
    string password;    
};

int main()
{
    fstream afile;
    afile.open("user.dat",ios::out|ios::binary);

    user person;

    person.ID ="001";

    person.password ="abc";

    afile.write (reinterpret_cast <const char *>(&person), sizeof (person));

    person.ID ="002";

    person.password ="def";

    afile.write (reinterpret_cast <const char *>(&person), sizeof (person));

    afile.close();

    afile.open("user.dat",ios::in|ios::binary);


    while (afile.read (reinterpret_cast <char *>(&person), sizeof (person)))
    {
        cout<<person.ID
            <<" "
            <<person.password
            <<endl;

    }

}

Espero que a saída do meu console seja

001 abc
002 def

Em vez disso, estou recebendo

002 def 
002 def

Alguém pode me explicar?

questionAnswers(3)

yourAnswerToTheQuestion