バイナリファイルに項目を書き込んで閉じ、もう一度開いて読み込みたいとします。コードはシンプルでわかりやすく、Visual Studio 2008を使用してコンパイルしてエラーなく実行しました。バイナリファイルからstd :: string値を読み書きする方法
ただし、GCCコンパイラで実行しているときに「セグメント障害」が発生します。
私は間違っていますか?
#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;
}
これはあなたの問題とは無関係ですが、2つの 'operator []'関数の 'return(string&)" "という行は**未定義の動作**です。あなたは(暗黙的に)return文で一時的な 'std :: string'オブジェクトを構築してから、その一時的な参照を返します。これは大きなno-noです。静的/大域オブジェクトへの参照を返すか、アサーションを生成するか例外をスローする方がよいでしょう。 –
アダムに感謝します。私は今問題を理解しています。 – Chan