文件写入读出修改求助

zdnan001 2012-05-29 04:14:24
#include<iostream>
#include<string>
using namespace std;

typedef struct NodeUser//账号结点结构体
{
string AccountNum;//账号
string name;//姓名
string id;//身份证
long int allmoney;//账户余额
NodeUser*next;//指向下一个结点的指针
};

class Menu//菜单类
{
public:
Menu();
void AddUser(); //开户
void DeleteUser(); //销户
void DepositMoney(long int);//存款
void DrawMoney(long int);//取款
private:
NodeUser*headnode;//头结点
};

class NoMoney//异常类
{
public:
NoMoney(){}
};

int main()//主函数
{
int choice;//选择操作
long int money;
Menu manage;

do//选择退出前可持续选择
{
cout<<"1)开户"<<endl;
cout<<"2)销户"<<endl;
cout<<"3)存款"<<endl;
cout<<"4)取款"<<endl;
cout<<"5)退出"<<endl;
cout<<"请选择项目:";

cin>>choice;
system("CLS");//清屏

switch(choice)
{
case 1:manage.AddUser();break;//开户
case 2:manage.DeleteUser();break;//销户
case 3:manage.DepositMoney(money);break;//存款
case 4://取款
try
{
manage.DrawMoney(money);
}
catch(NoMoney)
{
cout<<"账户金额小于取款金额,无法操作!"<<endl;
}
break;

case 5:{cout<<"谢谢使用!"<<endl;exit(1);}//退出
default:cout<<"输入错误,无法操作!\n重新选择!"<<endl;break;//只能选择1~5
}
}
while(1);//选择5则退出
}

Menu::Menu()//构造函数
{
headnode=new NodeUser;//为头结点分配内存
headnode->next=NULL;//初始化为空
}

void Menu::AddUser()//开户
{
NodeUser*node=new NodeUser;//为新结点分配内存空间
cout<<"请输入要开户的账号:";
cin>>node->AccountNum;
cout<<"请输入姓名:";
cin>>node->name;
cout<<"请输入身份证号:";
cin>>node->id;
cout<<"请输入开户金额:";
cin>>node->allmoney;

NodeUser*curNode;//定义两个结点用于搜索
NodeUser*preNode;

if(headnode->next==NULL)//每添加结点就把新结点放在头结点后
{
node->next=headnode->next;
headnode->next=node;
}

else//否则,若没添加新结点,就将结点放在最后
{
preNode=headnode;
curNode=preNode->next;

while(curNode!=NULL)//查询要开户的账号是否已存在
{
if(curNode->AccountNum==node->AccountNum)
{
cout<<"该账户已存在!\n";
return;
}

else
{
curNode=curNode->next;
}
}
if(curNode==NULL)//将结点放在头结点后
{
node->next=headnode->next;
headnode->next=node;
}
}
cout<<"开户成功!\n";
}

void Menu::DeleteUser()//销户
{
string AccountNum;
NodeUser*curNode;
NodeUser*preNode;
preNode=headnode;
curNode=preNode->next;

cout<<"请输入要销户的账户:";
cin>>AccountNum;//输入要删除的账号

if(curNode==NULL)//如果没有该账号
{
cout<<"该账户不存在!\n";
}

else//否则在链表中查找该账号
{
while(curNode!=NULL)
{
if(curNode->AccountNum==AccountNum)//如果找到了就删除
{
NodeUser*node=curNode;
preNode->next=curNode->next;
curNode=curNode->next;
delete node;
cout<<"销户成功!"<<endl;
return;
}

else//否则继续往后查找
{
preNode=curNode;
curNode=curNode->next;
}
}

if(curNode==NULL)
{
cout<<"该账户不存在!\n";
}
}
}

void Menu::DepositMoney(long int money)//存钱
{
string AccountNum;
cout<<"请输入账户:";
cin>>AccountNum;
NodeUser*curNode;
curNode=headnode->next;

while(curNode!=NULL)//在链表中查找
{
if(curNode->AccountNum==AccountNum)//如果找到了就输入存款金额
{
cout<<"账户姓名为:"<<curNode->name<<endl;
cout<<"账户身份证为:"<<curNode->id<<endl;
cout<<"账户当前余额为:"<<curNode->allmoney<<endl;
cout<<"请输入存款金额:";
cin>>money;
curNode->allmoney+=money;

cout<<"存款后账户余额为:"<<curNode->allmoney<<endl;
return;
}

else//否则继续往后查找
{
curNode=curNode->next;
}
}

if(curNode==NULL)
{
cout<<"该账户不存在!\n";
}
}

void Menu::DrawMoney(long int money)//取钱
{
string AccountNum;
cout<<"请输入账号:";
cin>>AccountNum;
NodeUser*curNode;
curNode=headnode;

while(curNode!=NULL)//在链表中查找该账号
{
if(curNode->AccountNum==AccountNum)
{
cout<<"账户姓名为:"<<curNode->name<<endl;
cout<<"账户身份证为:"<<curNode->id<<endl;
cout<<"账户当前余额为:"<<curNode->allmoney<<endl;
cout<<"请输入取款金额:";
cin>>money;
if(money>curNode->allmoney)
{
throw NoMoney();//如果取款金额大于账户余额,抛出一个异常
}
else
{
curNode->allmoney-=money;
cout<<"取款后账户余额为:"<<curNode->allmoney<<endl;
}
return;
}
else
{
curNode=curNode->next;
}
}
if(curNode==NULL)//没有这个账号
{
cout<<"该用户不存在!\n";
}
}


已经在该cpp文件所在文件夹创建好num.txt name.txt id.txt money.txt四个txt文件,分别用来存放账号,姓名,身份证,余额这四个数据,要求四个文件的数据可以一一对应,数据全都储存在这四个txt文件,可以写入读出修改删除。


要求在上面这段代码基础上改成符合上述要求的程序,急求高人相助!谢谢!
...全文
107 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-06-01
  • 打赏
  • 举报
回复
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

推荐使用WinHex软件查看文件或内存中的原始字节内容。
xiaoji0507 2012-06-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 3 楼 的回复:

FILE 文件指针 操作你那个问题很简单。

同学又是个作业


我不知道该怎样把链表和文件流结合起来,求指点啊……
[/Quote]
文件可以这样保存num,name,id,money;num,name,id,money;....
然后你读取这个文件进行解析,遇到一个逗号则表示一个数据域,遇到一个分号则表示一个结构体
当然,这样做的前提条件是你存放数据的时候数据必须完整
zdnan001 2012-06-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

FILE 文件指针 操作你那个问题很简单。

同学又是个作业
[/Quote]

我不知道该怎样把链表和文件流结合起来,求指点啊……
dic_008 2012-05-31
  • 打赏
  • 举报
回复
FILE 文件指针 操作你那个问题很简单。

同学又是个作业
zdnan001 2012-05-31
  • 打赏
  • 举报
回复
更改下要求,数据存放在一个txt文件里就可以了,不用四个。
求相助啊……
zdnan001 2012-05-29
  • 打赏
  • 举报
回复
可以C语言和C++语言混合使用

64,683

社区成员

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

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