Ich möchte ein Objekt in eine Binärdatei schreiben, es schließen und es erneut öffnen, um es zu lesen. Der Code ist einfach und unkompliziert, er kompiliert und lief ohne Fehler mit Visual Studio 2008.Wie lese/schreibe ich std :: string Werte von/in Binärdateien
Es hat jedoch "Segmentfehler" beim Ausführen mit dem GCC-Compiler.
Was mache ich falsch?
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class Item
{
private:
string itemID;
string itemName;
string itemState;
public:
Item(const string& id = "i0000", const string& name = "Zero item", const string& state = "not init")
: itemID(id) , itemName(name) , itemState(state)
{
}
string& operator [](int x)
{
if (0 == x)
return itemID;
if (1 == x)
return itemName;
if (2 == x)
return itemState;
return (string&)"";
}
const string& operator [](int x) const
{
if (0 == x)
return itemID;
if (1 == x)
return itemName;
if (2 == x)
return itemState;
return (string&)"";
}
public:
friend istream& operator >>(istream& i, Item& rhs)
{
cout << " * ItemID: ";
getline(i, rhs.itemID);
cout << " - Item Name: ";
getline(i, rhs.itemName);
cout << " - Item State: ";
getline(i, rhs.itemState);
return i;
}
friend ostream& operator <<(ostream& o, const Item& rhs)
{
return o << "ID = " << rhs.itemID
<< "\nName = " << rhs.itemName
<< "\nState = " << rhs.itemState << endl;
}
};
void write_to_file(const string& fn, const Item& item)
{
fstream outf(fn.c_str(), ios::binary | ios::out);
Item temp(item);
outf.write(reinterpret_cast<char *>(&temp), sizeof(Item));
outf.close();
}
void read_from_file(const string& fn, Item& item)
{
fstream inf(fn.c_str(), ios::binary | ios::in);
if(!inf)
{
cout << "What's wrong?";
}
Item temp;
inf.read(reinterpret_cast<char *>(&temp), sizeof(Item));
item = temp;
inf.close();
}
int main()
{
string fn = "a.out";
//Item it("12", "Ipad", "Good");
//write_to_file(fn, it);
Item temp;
read_from_file(fn, temp);
cout << temp;
return 0;
}
Dies hat nichts mit Ihrem Problem zu tun, aber die beiden Zeilen 'return (string &)" "' in den beiden 'operator []' Funktionen sind ** undefiniertes Verhalten **.Sie konstruieren (implizit) ein temporäres 'std :: string'-Objekt in der return-Anweisung und geben dann einen Verweis auf dieses temporary zurück, was ein großes no-no ist. Sie sollten stattdessen einen Verweis auf ein statisches/globales Objekt zurückgeben oder besser noch eine Assertion auslösen oder eine Ausnahme auslösen. –
Vielen Dank Adam. Ich verstehe mein Problem jetzt. – Chan