现在的位置: 首页 > 综合 > 正文

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

2013年10月11日 ⁄ 综合 ⁄ 共 8322字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.