std::string 写入文件没错误 --------------------------- 偶然

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



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值