Ich möchte ein Item in eine Binärdatei schreiben, es schließen und wieder öffnen, um es zu lesen. Der Code ist einfach und unkompliziert, er wurde mit Visual Studio 2008 kompiliert und fehlerfrei ausgeführt.
Beim Ausführen mit dem GCC-Compiler wurde jedoch ein “Segmentfehler” angezeigt.
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, sondern mit den beiden Zeilen
return ( string& )""
in den beidenoperator[]
Funktionen sind undefiniertes Verhalten. Sie konstruieren (implizit) ein Provisoriumstd::string
Objekt in der return-Anweisung und dann einen Verweis auf dieses Temporär zurückgeben, was ein großes No-Go ist. Sie sollten stattdessen einen Verweis auf ein statisches/globales Objekt zurückgeben oder noch besser eine Assertion auslösen oder eine Ausnahme auslösen.– Adam Rosenfield
23. November 2010 um 6:33 Uhr
Vielen Dank Adam. Ich verstehe mein Problem jetzt.
– Chan
23. November 2010 um 6:54 Uhr