写入:A a(...);
file.write((char*) &a,sizeof(A));
读取:A *b = new A();
file.read((char*) b,sizeof(A));
//还必须用类的指针(类中含有string),不然运行时错误(有关std::string的内存共享问题)
关键是不管string有多大,比如100多个字符,用read,write函数时sizeof(A)都不变化,他还能写入。。。
而重载<<,>>运算符实现起来是比较方便,但是浪费了大量空间,而且查找效率低下。。。。
好吧,我又有新发现,当string非常大时,哪怕是几千字节都没事,只要是在同一个程序中进行读取,就没有问题。。。
而一旦哪怕是几百字节,放到两个不同的程序中分别进行读和写就Crash了。。。。
--------------------------------------------------------------------------------------
Sprite.h头文件
#ifndef _SPRITE_H_
#define _SPRITE_H_
#include <iostream>
#include <string>
class Sprite
{
private:
std::string profession;//职业
std::string weapon;//武器
static int count;//个数
public:
Sprite(){}
Sprite(std::string profession,std::string weapon):profession(profession),weapon(weapon)
{
}
void showSprite();//显示精灵信息
};
int Sprite::count=0;
void Sprite::showSprite()
{
++count;
std::cout<<"精灵"<<count<<" 职业:"<<profession<<" 武器:"<<weapon<<std::endl;
}
#endif
main.cpp主文件
#include <iostream>
#include <fstream>
#include <string>
#include "Sprite.h"
int main()
{
//建立对象数组
Sprite sprites[3]={
Sprite("法师","魔杖"),
Sprite("战士","屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz"),
Sprite("道士","倚天剑")
};
//打开文件
std::ofstream file("file.dat",std::ios::ate|std::ios::binary);
if(!file)
{
std::cout<<"文件打开失败!";
abort();//等同于exit
}
//写文件
for(int i=0;i<3;i++)
file.write((char*) &sprites[i],sizeof(Sprite));
//关闭文件
file.close();
//建立对象数组
Sprite *rsprites[3];
//打开文件
std::ifstream rfile("file.dat",std::ios::binary);
if(!rfile)
{
std::cout<<"文件打开失败!";
return 1;//等同于exit
}
//读文件
for(int i=0;i<3;i++)
{
rsprites[i] = new Sprite();
rfile.read((char*) rsprites[i],sizeof(Sprite));
rsprites[i]->showSprite();
}
//关闭文件
rfile.close();
return 0;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
将读写分离
main1.cpp
#include <iostream>
#include <fstream>
#include <string>
#include "Sprite.h"
int main()
{
//建立对象数组
Sprite sprites[3]={
Sprite("法师","魔杖"),
Sprite("战士","屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz屠龙宝刀zzzzz"),
Sprite("道士","倚天剑")
};
//打开文件
std::ofstream file("file.dat",std::ios::ate|std::ios::binary);
if(!file)
{
std::cout<<"文件打开失败!";
abort();//等同于exit
}
//写文件
for(int i=0;i<3;i++)
file.write((char*) &sprites[i],sizeof(Sprite));
//关闭文件
file.close();
//建立对象数组
Sprite *rsprites[3];
//打开文件
std::ifstream rfile("file.dat",std::ios::binary);
if(!rfile)
{
std::cout<<"文件打开失败!";
return 1;//等同于exit
}
//读文件
for(int i=0;i<3;i++)
{
rsprites[i] = new Sprite();
rfile.read((char*) rsprites[i],sizeof(Sprite));
rsprites[i]->showSprite();
}
//关闭文件
rfile.close();
return 0;
}
main2.cpp
#include <iostream>
#include <fstream>
#include <string>
#include "Sprite.h"
int main()
{
//建立对象数组
Sprite *rsprites[3];
//打开文件
std::ifstream rfile("file.dat",std::ios::binary);
if(!rfile)
{
std::cout<<"文件打开失败!";
return 1;//等同于exit
}
//读文件
for(int i=0;i<3;i++)
{
rsprites[i] = new Sprite();
rfile.read((char*)rsprites[i],sizeof(Sprite));
rsprites[i]->showSprite();
}
//关闭文件
rfile.close();
return 0;
}
main1.cpp读写没有问题,main2.cpp单独读取文件就Crash了。。
原理应该是和string有关。。。。
总结:
类中最好只是用char str[30];这些固定长度的就没问题了,写入文件都是固定大小,不会越界什么的了,析构什么的也不会出错。。。