Das geht so nicht. Du kansnt nicht einfach strings hintereinander in die Datei schreiben, woher soll er beim lesen wissen, wann der erste String aufhört und wann der zweite anfängt?
Du kannst die nichtmal einfach so in die Datei schreiben, sondern muss auch den Inhalt in die Datei schreiben. ein Stringobjekt hat intern einen Pointer auf die einzelnen Zeichen du schreibst derzeit nur den Pointer in die Datei, und das ist ziemlich nutzlos.
Du könntest z.B. erst die Länge in die Datei schreiben (str.length() oder so) und dann die einzelnen zeichen (string.c_str(), sizeof(char)*str.length()) oder halt beim lesen bis zum \0 lesen, was auch irgendwie fummelig ist.
Einfacher ist es, primitive Datentypen (int, float, char, NICHT char*) in Dateien zu schreiben, komplexere Datentypen (Container wie std::string, std::list, Pointer, Referenzen) machen da schon einiges mehr an Ärger.
boost::serialization nimmt dir da viel ab, aber es mag für dich noch zu komplex sein (weil man imemr grob verstehen sollte, was im hintergrund passiert). ticpp ist aber auch schön, das könntest du dir auch mal ansehen.