c++文件流操作,如何向文件写入对象

蓝鹰 2012-02-12 11:47:29

#include<iostream>
#include<stdlib.h>
#include<ctime>
#include<string>
#include<fstream>
using namespace std;


class FoodCard
{
private:
string Name;
float Money;
int state; //表示账户是否被冻结
//int OrderCode; //序号
public:
string Num; //身份证用作标识,设为公有似乎更合理
FoodCard *Next;

FoodCard(int times/*int OrderCode*/);//建立新卡时被调用
void Spend(int Money); //如果Money为负,则为充值
void show();
void set();
void change();
void init();
};

class List
{
private:
FoodCard *foodcard; //头结点
int Size;
int maxOCode;
public:
List();
void insert();
FoodCard* find();
void save();
void destory();
void Delete(FoodCard *foodcard);


};

/*实现部分*/
FoodCard::FoodCard(int times/*int OrderCode*/)
{
if(times==0)
{
this->Next=NULL;
return;
}
std::cout<<"请输入姓名(输入“*”以办理临时卡)"<<endl;
std::cin>>this->Name;
if(this->Name=="*")
{
this->Num="*";
goto tempcard;
}
std::cout<<"请输入身份证号码"<<endl;
std::cin>>this->Num; //身份证
tempcard:
std::cout<<"请输入金额(若输入0,则设置为默认金额20元"<<endl;
std::cin>>this->Money;
if(this->Money==0)
this->Money=20;
//this->OrderCode=OrderCode;
Next=NULL;
state=0; //状态为非挂失状态
std::cout<<"饭卡生成成功!"<<endl;
}
void FoodCard::Spend(int Money)
{
if(state==0)
this->Money=this->Money-Money;
else
std::cout<<"该卡已经被冻结,无法消费"<<endl;
}

List::List()
{
Size=0;
maxOCode=0;
foodcard=new FoodCard(0); //为什么要这样才不会异常?

}
void List::insert()
{
FoodCard *p,*q;

this->Size++;
this->maxOCode++;
p=foodcard; //本菜单中的“foodcard”
while(p->Next!=NULL)
{
p=p->Next;
}
q=new FoodCard(1/*maxOCode*/);//生成新饭卡

p->Next=q;
//q->Next=NULL; 这一句和下一句是否有区别
q->Next=p->Next;
save();
}
void FoodCard::init()
{
FoodCard::Money=NULL;
FoodCard::Name="";
FoodCard::Num="";
FoodCard::state=0;
}
void FoodCard::set()
{
if(state==0)
{
state=1;
cout<<"挂失成功"<<endl;
}
else
{
state=0;
cout<<"解除挂失"<<endl;
}
}
/*void FoodCard::change(FoodCard *foodcard)
{
cout<<"选择操作:1.修改姓名;2.修改金额;3.按序号查询;4.退出"<<endl;
//cin>>choice;
//switch(choice)
//{
//case 1:
// {
// string name;
// cout<<"请输入姓名!"<<endl;
// cin>> name;
};*/
FoodCard* List::find()
{
string num;
FoodCard *p;

p=foodcard->Next;
std::cout<<"请输入身份证号码"<<endl;
std::cin>>num;
while(p->Next!=NULL)
{
if(p->Num==num)
return p;
p=p->Next;
}
return foodcard;
}

void FoodCard::show()
{
cout<<Name<<endl;
cout<<Num<<endl;
cout<<Money<<endl;
if(state==1)
cout<<"此卡已经挂失"<<endl;
}
void List::save()
{
std::ofstream listfile("FoodCard.info",ios::out); //删除原链表信息,将新的链表信息插入,这似乎是最简单的方法。但是如果信息量大,这种操作无疑是缺乏效率的
if(listfile.fail())
{
cout<<"原文件不存在,已经开始创建文件..."<<endl;
}
listfile.write( );
cout<<"数据已保存"<<endl;
}
void main()
{
//std::time_t now=std::time(0);
//cout<<now<<endl;
List list;
std::ifstream listfile("FoodCard.info",ios::in);
std::cout<<"1.添加新饭卡 2.注销旧饭卡 3.设置与解除挂失 4.买饭 5.续钱 6.退出系统"<<endl;
Option:
cout<<"请输入选项编号:"<<endl;
int choice;
cin>>choice;
switch(choice)
{
case 1:
{
list.insert();
}break;
case 2:
{

}break;
case 3:
{

}break;
case 4:
{

}break;
case 5:
{

}break;
case 6:
{

}break;
default:
cout<<"你的选项非法!"<<endl;
goto Option;
}
system("pause");
}


大家请帮忙看看,save函数中的ofstream类对象的成员函数write()的参数列表该如何填写,以前很少用过文件流,见笑了。
...全文
347 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝鹰 2012-02-23
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 blackeaglex 的回复:]

引用 10 楼 czh3642210 的回复:

C/C++ code
ifndef COURSE_H
#define COURSE_H

#include <iostream>
#include<string>
using namespace std;

class Course
{
public:
string CName;
string teacher;
st……
[/Quote]
不好意思,没看清楚,但是我不太明白write和read函数的第一个参数是什么意思啊?
蓝鹰 2012-02-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 czh3642210 的回复:]

C/C++ code
ifndef COURSE_H
#define COURSE_H

#include <iostream>
#include<string>
using namespace std;

class Course
{
public:
string CName;
string teacher;
string homework;
double g……
[/Quote]
你的outT和inT好像是自己写的?
蓝鹰 2012-02-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 blackeaglex 的回复:]

引用 8 楼 jackyjkchen 的回复:

C++没有内置的序列化支持,写入对象是需要序列化的,而且无法跨平台跨语言,换了个编译器或运行库版本可能都出问题
也许我可以将对象的成员变量分开来一个一个的输出到文件里面去。只是这真的好麻烦。
[/Quote]
谢谢你的回答,最近也在求职,有空我看看。
Qlaiaqu 2012-02-14
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 greatoo_cx 的回复:]

借贵宝地请教个问题可以吗,我自己的技术分用没了。谢谢各位了!
我写了一个timer事件,用来计时,用于timer.h和timer.cpp的代码是我复制的,所以调试通过以后,在运行的时候提示断言失败,appcore.cpp line 280行有问题,忽略问题程序可以正常执行,但是我想知道怎么能去掉这个提示呢,谢谢。
[/Quote]
这只是说明你写的time.h有问题而已
greatoo_cx 2012-02-14
  • 打赏
  • 举报
回复
借贵宝地请教个问题可以吗,我自己的技术分用没了。谢谢各位了!
我写了一个timer事件,用来计时,用于timer.h和timer.cpp的代码是我复制的,所以调试通过以后,在运行的时候提示断言失败,appcore.cpp line 280行有问题,忽略问题程序可以正常执行,但是我想知道怎么能去掉这个提示呢,谢谢。
luciferisnotsatan 2012-02-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 blackeaglex 的回复:]

引用 8 楼 jackyjkchen 的回复:

C++没有内置的序列化支持,写入对象是需要序列化的,而且无法跨平台跨语言,换了个编译器或运行库版本可能都出问题
也许我可以将对象的成员变量分开来一个一个的输出到文件里面去。只是这真的好麻烦。
[/Quote]
如果只是在windows上用,可以用微软提供的。不然就只能自己定了。
Qlaiaqu 2012-02-14
  • 打赏
  • 举报
回复
什么结构写,什么结构读,类和结构体一样读写就行了
赵4老师 2012-02-14
  • 打赏
  • 举报
回复
对象的序列化
sl51314240 2012-02-14
  • 打赏
  • 举报
回复
重载>>与<<。类输出/输入一个指定的数据结构到文件中
面包大师 2012-02-13
  • 打赏
  • 举报
回复
ifndef COURSE_H
#define COURSE_H

#include <iostream>
#include<string>
using namespace std;

class Course
{
public:
string CName;
string teacher;
string homework;
double grade;
Course(string cn="Course",string tea="Teacher")
{
CName=cn;
teacher=tea;
homework="";
grade=0;
}
void setName(string na)
{
CName=na;
}
void setTea(string tea)
{
teacher=tea;
}
void setHomework(string hw)
{
homework=hw;
}
void setGrade(double grade1,double grade2,double scale)
{
grade=grade1*scale/100+grade2*(100-scale)/100;
}
string getName()
{
return CName;
}
string getTeacher()
{
return teacher;
}
string getHomework()
{
return homework;
}
double getGrade()
{
return grade;
}
};

#endif

#ifndef TEACHER_H
#define TEACHER_H

#include<iostream>
#include<string>
using namespace std;

class Teacher
{
private:
int ID;
string Name;
string code;
Course CN;
double scale;
public:
Teacher(string na="Teacher",int id=0,string co="54321",string cn="Course")
{
CN.setTea(na);
ID=id;
Name=na;
code=co;
CN.setName(cn);
CN.setTea(na);
scale=0;
}
void setName(string na){Name=na;}
void setID(int id){ID=id;}
void setCode(string co){code=co;}
void setCourse(string cn){CN.setName(cn);}
void setScale(double s)
{
scale=s;
}
int getID(){return ID;}
double getScale(){return scale;}
string getCode(){return code;}
string getName(){return Name;}
string getCourseName(){return CN.getName();}



};



#endif

#include<iostream>
#include<string>
#include<fstream>
#include<iomanip>
#include<cstdlib>
using namespace std;

#include"Course.h"
#include"Teacher.h"

void initial(ofstream&);

void test(fstream&);

int main()
{
fstream inT("d:\\teacher.dat",ios::in);
if(!inT)
{
cerr<<"文件不存在!\n-------->新建文件\n";
ofstream outT("d:\\teacher.dat",ios::out);
initial(outT);
outT.close();
inT.open("d:\\teacher.dat",ios::in);
}
test(inT);

inT.close();
return 0;
}

void initial(ofstream& outT)
{
Teacher tea;
for(int i=0;i<=2000;i++)
{
tea.setID(i);
outT.seekp(i*sizeof(Teacher));
outT.write(reinterpret_cast<const char*>(&tea),sizeof(Teacher));
cout<<tea.getID()<<" ";
}
}

void test(fstream& io)
{
Teacher t;
for(int i=27;i<=2000;i++)
{
io.seekg(i*sizeof(Teacher));
io.read(reinterpret_cast<char *>(&t),sizeof(Teacher));
cout<<t.getID()<<endl;
}
}

楼主本来想给你写来着,有点事回家晚了,希望上边的程序能给你些帮助
蓝鹰 2012-02-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jackyjkchen 的回复:]

C++没有内置的序列化支持,写入对象是需要序列化的,而且无法跨平台跨语言,换了个编译器或运行库版本可能都出问题
[/Quote]也许我可以将对象的成员变量分开来一个一个的输出到文件里面去。只是这真的好麻烦。
jackyjkchen 2012-02-13
  • 打赏
  • 举报
回复
C++没有内置的序列化支持,写入对象是需要序列化的,而且无法跨平台跨语言,换了个编译器或运行库版本可能都出问题
merlinfang 2012-02-13
  • 打赏
  • 举报
回复
深入浅出MFC里有描述了怎么序列化对象的
面包大师 2012-02-13
  • 打赏
  • 举报
回复
楼主淡定。。。
蓝鹰 2012-02-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pathuang68 的回复:]

请参考:
一个在加拿大上学的朋友的暑假作业 里面有向文件写对象的代码。
[/Quote]
……
pathuang68 2012-02-13
  • 打赏
  • 举报
回复
请参考:
一个在加拿大上学的朋友的暑假作业 里面有向文件写对象的代码。
蓝鹰 2012-02-12
  • 打赏
  • 举报
回复
真的没人吗?
蓝鹰 2012-02-12
  • 打赏
  • 举报
回复
没人能帮下忙吗?
蓝鹰 2012-02-12
  • 打赏
  • 举报
回复
我是希望将整个list对象写入到文件中

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧