怎样c++ 从txt文件中读取信息到类的对象

end 2010-07-13 09:59:14
做了一个通讯录系统 后来才知道要求把每次输入和改动的数据都存入一个txt文件中 一边下一次继续使用
我只会独取出所有数据到一个数组中,饶后让他显示出来。但是这不具备要求的修改查询功能。
这是要求:
数据描述: 姓名 性别 班级 电话
功能:1.浏览数据 2.增加数据 3.修改数据 4.查询数据(按姓名,按电话) 5.退出

这是我原来的代码,没有存入到txt中。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
static int num=0;
class address
{
public:
void set();
void correct();
string getname();
string gettel();
void get();
private:
string name;
string tel;
string sex;
string Class;
};
void address::set()
{
cout<<"姓名:";
cin>>name;
cout<<""<<endl;
cout<<"性别:";
cin>>sex;
cout<<""<<endl;
cout<<"班级:";
cin>>Class;
cout<<""<<endl;
cout<<"电话:";
cin>>tel;
cout<<"输入完毕!"<<endl;
}
string address::getname()
{
return name;
}
string address::gettel()
{
return tel;
}
void address::get()
{
cout<<"姓名:"<<name<<"----";
cout<<"性别:"<<sex<<"----";
cout<<"班级:"<<Class<<"----";
cout<<"电话:"<<tel<<endl;
}
void main()
{
vector<address> P;
cout<<"Welcome to the address system!"<<endl;
for(int y=0;;y++)
{
cout<<"*******************************"<<endl;
cout<<"功能介绍:"<<endl;
cout<<"1.浏览通讯录" <<endl;
cout<<"2.增加新成员"<<endl;
cout<<"3.修改原数据"<<endl;
cout<<"4.按姓名查询"<<endl;
cout<<"5.按电话查询"<<endl;
cout<<"6.退出"<<endl;
cout<<"*******************************"<<endl;
int choise;
string NA,m,z;
string TE;
lop:cout<<"请选择你要进行的操作编号:";
cin>>choise;
int j,i,h;
address pus;
switch (choise)
{
case 1:
for(j=1;j<=num;j++)
{
P[j-1].get();
}
break;

case 2:
cout<<"请输入:"<<endl;
pus.set();
P.push_back(pus);
num++;
break;

case 3:
cout<<"请输入要修改的人的姓名:";
cin>>m;
for(i=0;i<=num-1;i++)
{
z=P[i].getname();
if(z==m)
break;
}
cout<<"请输入新信息:";
P[i].set();
break;

case 4:
cout<<"请输入要查找的人的姓名:";
cin>>NA;
cout<<""<<endl;
for( j=1;j<=num;j++)
{
if(P[j-1].getname()==NA)
{
P[j-1].get();
break;
}
}
break;

case 5:

cout<<"请输入要查询的号码:";
cin>>TE;
for(h=1;h<=num;h++)
{
if(P[h-1].gettel()==TE)
{
P[h-1].get();
break;
}
}
break;

case 6:goto loop;
default:
cout<<"输入有误,请重新输入!"<<endl;
goto lop;
}
}
loop:cout<<"欢迎再次使用本系统,再见!" <<endl;
}



大虾帮帮忙 看几小时书,关于读取文件那里的,还是没找到我需要的信息。。。急
...全文
1863 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
SAIL++ 2011-07-12
  • 打赏
  • 举报
回复
cnike是好人!
笨笨周0915 2010-07-13
  • 打赏
  • 举报
回复

struct FileHeader
{
DWORD dwHeader; //四个字节 游戏名称
DWORD dwVersion; //四个字节 游戏版本
DWORD dwSize; //文件大小
DWORD dwReserve; //保留
};
struct PacketHeader
{
DWORD dwPacketCount; //4个字节 包的个数
DWORD dwReserve;
};
struct PacketInfo //包的信息
{
WORD PacketID; //包的协议ID
WORD PacketLen; //包的长度
CHAR PacketBuf[1024]; //包的内容
};
int _tmain(int argc, _TCHAR* argv[])
{


FileHeader fh;
fh.dwHeader = 0x4A475A44;
fh.dwVersion = 0x10409;
fh.dwSize = 0;
fh.dwReserve = 0;
ofstream fout("Packet.dat",ios::binary);
fout.write((char*)(&fh),sizeof(fh));
PacketHeader ph;
ph.dwPacketCount = 1;
ph.dwReserve = 0;
fout.write((char*)(&ph),sizeof(ph));

//写包数据
PacketInfo phInfo;
phInfo.PacketID = 1;
phInfo.PacketLen = 16;
strcpy(phInfo.PacketBuf,"杭州边锋网络");
fout.write((char*)&phInfo.PacketID,sizeof(phInfo.PacketID));
fout.write((char*)&phInfo.PacketLen,sizeof(phInfo.PacketLen));
fout.write((char*)&phInfo.PacketBuf,phInfo.PacketLen);
fout.close();


//读取数据
ifstream fin("Game.rpg",ios::binary);
FileHeader ifh;
fin.read((char*)&ifh,sizeof(ifh));
cout<<"FileHeader: dwHeader = "<<ifh.dwHeader<<" dwVersion= "<<ifh.dwVersion<<" dwSize = "<<ifh.dwSize<<" dwReserve "<<ifh.dwReserve<<endl;
PacketHeader iph;
fin.read((char*)&iph,sizeof(iph));
cout<<"PacketHeader: dwPacketCount = "<<iph.dwPacketCount<<" dwReserve= "<<iph.dwReserve<<endl;
for (int i= 0; i< iph.dwPacketCount;i++)
{
PacketInfo iphInfo;
fin.read((char*)&iphInfo.PacketID,sizeof(iphInfo.PacketID));
fin.read((char*)&iphInfo.PacketLen,sizeof(iphInfo.PacketLen));
fin.read((char*)&iphInfo.PacketBuf,iphInfo.PacketLen);
iphInfo.PacketBuf[iphInfo.PacketLen] = '\0';
cout<<"PacketInfo: PacketID ="<<iphInfo.PacketID<<" PacketLen= "<<iphInfo.PacketLen<<" PacketBuf = "<<iphInfo.PacketBuf<<endl;

cout<<"==========================================================="<<endl;
}

system("pause");
return 0;
}

变量名的自己修改下
MFC_ipsu 2010-07-13
  • 打赏
  • 举报
回复
LZ我可以告诉你一种思想。因为像这样的数据最好的保存就是运用数据库,但LZ没有。那我觉得可以考虑运用这种方法。你可以为每一个学生都建一个ini文件,而ini文件名可以命名为“姓名+电话.ini”,例如“张三13428708662.ini”。而在ini文件中设有四个字段,那就是“Name,Sex,Class,Tel”,然后将对应的数据填写到各字段中去就可以了。LZ百度一下怎么读写ini文件。
MFC_ipsu 2010-07-13
  • 打赏
  • 举报
回复
我可能告诉你一种思想。因为你这数据保存的时候相对有点多,又没有应用数据库。如果你把所有人的信息“ 姓名 性别 班级 电话”,保存到一个txt里面的话,会有点麻烦。如果是我做的话,可以考虑用ini文件。然而你可以为每个学生建一个ini文件,文件名可以这样取,例如“张三13428708662.ini”。在ini文件中有四的字段“Name,Sex,Class,Tel”。将对应的字段填上去就可以了。你百度一下怎么读写ini文件。
end 2010-07-13
  • 打赏
  • 举报
回复
还有存入的时候怎么以结构体的形式存入呢 我便以有错 只能一个数据一个数据的存入、、
急死我了
end 2010-07-13
  • 打赏
  • 举报
回复
不行 关于文件这里我实在太小白了 一点看不懂 这里面的每一句都有看不懂的, 能不能谢的具体点,就是写入文件后,怎么读取赋值到结构体每一个成员上的。还有这些在主函数里的位置。变量用我的程序里的名字,文件名字用text ,这样就容易看了。 谢谢啦

PacketHeader iph; //文件头结构
fin.read((char*)&iph,sizeof(iph));//读取文件头

//读取文件中的消息包
for (int i= 0; i< iph.dwPacketCount;i++)
{
PacketInfo *iphInfo = new PacketInfo ;
fin.read((char*)&iphInfo->PacketID,sizeof(iphInfo->PacketID));
fin.read((char*)&iphInfo->PacketLen,sizeof(iphInfo->PacketLen));
fin.read((char*)&iphInfo->PacketBuf,iphInfo->PacketLen);
g_PacketList.push_back(iphInfo);

}

end 2010-07-13
  • 打赏
  • 举报
回复
我去试试
teng0210 2010-07-13
  • 打赏
  • 举报
回复
热心人真多
笨笨周0915 2010-07-13
  • 打赏
  • 举报
回复

PacketHeader iph; //文件头结构
fin.read((char*)&iph,sizeof(iph));//读取文件头

//读取文件中的消息包
for (int i= 0; i< iph.dwPacketCount;i++)
{
PacketInfo *iphInfo = new PacketInfo ;
fin.read((char*)&iphInfo->PacketID,sizeof(iphInfo->PacketID));
fin.read((char*)&iphInfo->PacketLen,sizeof(iphInfo->PacketLen));
fin.read((char*)&iphInfo->PacketBuf,iphInfo->PacketLen);
g_PacketList.push_back(iphInfo);

}
笨笨周0915 2010-07-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wl6965307 的回复:]
没说用txt 只要存入本地 下次启动程序能读取就行 年中课程设计 明天就要去作报告了 今天才知道有这么个要求 不是这么急的话 我就自己研究研究了
[/Quote]
按照我说的就可以了呀。。你以二进制的形式写入就ok了。。。。
end 2010-07-13
  • 打赏
  • 举报
回复
没说用txt 只要存入本地 下次启动程序能读取就行 年中课程设计 明天就要去作报告了 今天才知道有这么个要求 不是这么急的话 我就自己研究研究了
MFC_ipsu 2010-07-13
  • 打赏
  • 举报
回复
你们老师让你们用txt保存数据的么。
笨笨周0915 2010-07-13
  • 打赏
  • 举报
回复
如果要写入文件话 你可以在程序退出的时候 将你的信息已struc的形式写入文件,那你在读取的时候 每次读取一个struct 就ok了
Eleven 2010-07-13
  • 打赏
  • 举报
回复
作业???
sujiewen 2010-07-13
  • 打赏
  • 举报
回复
调试,调试这是最基本的
漫步者、 2010-07-13
  • 打赏
  • 举报
回复
添加一个保存文件的语句,就OK了,那个C语言书上有,自己去琢磨一下,我刚也做了一个类似的,我怎么感觉你这个程序跟我在学校做的课程设计有点像啊,呵呵。
liuwei2500 2010-07-13
  • 打赏
  • 举报
回复
这个无外乎就是一个写入文件和读取文件,应该有一个唯一的编号存在,当需要修改的时候,根据编号来找到药修改的相应信息,然后就是读取这段信息,执行修改
笨笨周0915 2010-07-13
  • 打赏
  • 举报
回复 1

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
static int num=0;
struct AddressHeader
{
DWORD dwPacketCount; //4个字节 包的个数
DWORD dwReserve;
};
struct AddressInfo //包的信息
{
CHAR Name[32];
CHAR Tel[32];
CHAR Sex[32];
CHAR Class[32];
};
class address
{
public:
address(){};
address(string na,string te,string se,string cl)
{
name = na;
tel = te;
sex = se;
Class = cl;
}
void set();
void correct();
string getname();
string gettel();
string getsex(){return sex;};
string getclass(){return Class;};
void get();
private:
string name;
string tel;
string sex;
string Class;
};
void address::set()
{
cout<<"姓名:";
cin>>name;
cout<<""<<endl;
cout<<"性别:";
cin>>sex;
cout<<""<<endl;
cout<<"班级:";
cin>>Class;
cout<<""<<endl;
cout<<"电话:";
cin>>tel;
cout<<"输入完毕!"<<endl;
}
string address::getname()
{
return name;
}
string address::gettel()
{
return tel;
}
void address::get()
{
cout<<"姓名:"<<name<<"----";
cout<<"性别:"<<sex<<"----";
cout<<"班级:"<<Class<<"----";
cout<<"电话:"<<tel<<endl;
}
void ReadRecord(vector<address*>& p)
{
ifstream fin("Address.dat",ios::binary);
AddressHeader ifh;
memset(&ifh,0,sizeof(AddressHeader));
fin.read((char*)&ifh,sizeof(ifh));
for (int i= 0; i< ifh.dwPacketCount;i++)
{
AddressInfo iphInfo;
fin.read((char*)&iphInfo.Name,32);
fin.read((char*)&iphInfo.Tel,32);
fin.read((char*)&iphInfo.Sex,32);
fin.read((char*)&iphInfo.Class,32);
address *ad = new address(iphInfo.Name,iphInfo.Tel,iphInfo.Sex,iphInfo.Class);
p.push_back(ad);

}
fin.close();
}
void SaveRecord(vector<address*>& p)
{
ofstream fout("Address.dat",ios::binary);
AddressHeader ph;
ph.dwPacketCount = p.size();
ph.dwReserve = 0;
fout.write((char*)(&ph),sizeof(ph));
for (int i = 0; i < p.size(); i++)
{
//写包数据
AddressInfo phInfo;
strcpy(phInfo.Name, p[i]->getname().c_str());
strcpy(phInfo.Class, p[i]->getclass().c_str());
strcpy(phInfo.Sex, p[i]->getsex().c_str());
strcpy(phInfo.Tel, p[i]->gettel().c_str());
fout.write((char*)&phInfo.Name,32);
fout.write((char*)&phInfo.Tel,32);
fout.write((char*)&phInfo.Sex,32);
fout.write((char*)&phInfo.Class,32);
}
fout.close();
}
void main()
{
vector<address*> P;
ReadRecord(P);
num = P.size();
cout<<"Welcome to the address system!"<<endl;
for(int y=0;;y++)
{
cout<<"*******************************"<<endl;
cout<<"功能介绍:"<<endl;
cout<<"1.浏览通讯录" <<endl;
cout<<"2.增加新成员"<<endl;
cout<<"3.修改原数据"<<endl;
cout<<"4.按姓名查询"<<endl;
cout<<"5.按电话查询"<<endl;
cout<<"6.退出"<<endl;
cout<<"*******************************"<<endl;
int choise;
string NA,m,z;
string TE;
lop:cout<<"请选择你要进行的操作编号:";
cin>>choise;
int j,i,h;
address* pus = new address;
switch (choise)
{
case 1:
for(j=1;j<=num;j++)
{
P[j-1]->get();
}
break;

case 2:
cout<<"请输入:"<<endl;
pus->set();
P.push_back(pus);
num++;
break;

case 3:
cout<<"请输入要修改的人的姓名:";
cin>>m;
for(i=0;i<=num-1;i++)
{
z=P[i]->getname();
if(z==m)
break;
}
cout<<"请输入新信息:";
P[i]->set();
break;

case 4:
cout<<"请输入要查找的人的姓名:";
cin>>NA;
cout<<""<<endl;
for( j=1;j<=num;j++)
{
if(P[j-1]->getname()==NA)
{
P[j-1]->get();
break;
}
}
break;

case 5:

cout<<"请输入要查询的号码:";
cin>>TE;
for(h=1;h<=num;h++)
{
if(P[h-1]->gettel()==TE)
{
P[h-1]->get();
break;
}
}
break;

case 6:goto loop;
default:
cout<<"输入有误,请重新输入!"<<endl;
goto lop;
}
}
loop:cout<<"欢迎再次使用本系统,再见!" <<endl;
SaveRecord(P);
for (int i = 0; i < P.size(); i++)
{
if (P[i])
{
delete P[i];
P[i] = NULL;
}
}
}


帮你修改了下 自己看下吧
end 2010-07-13
  • 打赏
  • 举报
回复
都这么复杂啊 这次实在是太急了 没时间慢慢研究了 谁能把我的程序改好了贴出来 我知道这样很不好 但是实在是时间紧迫 大侠门帮帮忙 耽误不了多长时间就能完成 很简单的程序 江湖救急! 我跪求了!!!!

65,187

社区成员

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

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