包含字符串属性的读/写结构到二进制文件

时间:2014-04-09 11:25:13

标签: c++ string struct ifstream ofstream

我在阅读/编写具有复杂数据特定字符串的结构时遇到了问题。我的结构如下所示。

struct MyRecord {
  char name[80];
  string location;     // <<== note this 
  double balance;
  unsigned long account_num;
};

我使用不同的功能进行阅读和写作。

这是我用来将数据写入文件

的代码
struct MyRecord acc;

strcpy(acc.name, "R");
acc.location = "newlocation ok";    // <<== note this 
acc.balance = 1.3;
acc.account_num = 34;

ofstream outbal("balance", ios::out | ios::binary);
outbal.write((char *) &acc, sizeof(struct MyRecord));

就像我使用下面的代码从文件中读取一样。

ifstream inbal("balance", ios::in | ios::binary);
inbal.read((char *) &acc, sizeof(struct MyRecord));

当我编译时,它编译得很好,但是在执行时我得到了大量的错误消息

./binaryfile_3[0x8048f6a]
./binaryfile_3[0x8048e38]
./binaryfile_3[0x8048e54]
/lib/libc.so.6(__libc_start_main+0xe6)[0x148d26]
./binaryfile_3[0x8048aa1]
======= Memory map: ========
00132000-002c3000 r-xp 00000000 fd:00 918500     /lib/libc-2.12.so
// continues....

虽然,它可以在以下两个条件下工作。

  1. 读写功能相同
  2. 如果我删除了string location
  3. 我是c ++的新手,我尝试使用手册编写并最终出错。我搜索了几个解决方案,并在添加string属性时最终出错。上面的脚本也是我从网站上抓取的。我刚修改它以匹配我的问题,它具有不同的读/写功能和具有string

    的结构

    请帮我指出问题所在。感谢。

1 个答案:

答案 0 :(得分:0)

添加这两个功能

std::ostream & operator << ( std::ostream & os, const MyRecord & rec ) {
    os.write( rec.name, sizeof( rec.name ) );
    size_t sz = rec.location.size();
    os.write( & sz, iszeof( sz ) );
    os.write( rec.location.c_str(), sz );
    os.write( (char*) & balance, sizeof( rec.balance ) );
    os.write( (char*) & account_num, sizeof( rec.account_num ) );
    return os;
}
std::istream & operator >> ( std::ostream & is, MyRecord & rec ) {
    is.read( rec.name, sizeof( rec.name ) );
    size_t sz;
    is.read( & sz, iszeof( sz ) );
    rec.resize( sz );
    if ( sz != 0 ) {
        is.read( & rec.location[ 0 ], sz );
    }
    is.read( (char*) & balance, sizeof( rec.balance ) );
    is.read( (char*) & account_num, sizeof( rec.account_num ) );
}

这是一个用法

ofstream outbal("balance", ios::out | ios::binary);
outbal << acc;

ifstream inbal("balance", ios::in | ios::binary);
inbal >> acc;

这是Boost.Serialization的手工相似性差。事实上,使用boost,然后使用我的车辆会更好。