写入: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];这些固定长度的就没问题了,写入文件都是固定大小,不会越界什么的了,析构什么的也不会出错。。。