高手进、、 求 C语言 文件读取问题 ..

dxwsdosdo 2011-06-30 08:43:12
请帮忙修改下这个程序:加上

每次登录时读取上次保存在磁盘文件中的订票记录。

这个功能.

在线等
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"

typedef struct XXX
{
char k; /* 0表示无人,1表示有人 */
char n; /* 0表示可选,1表示不复合条件 */
char Name[30];
char Code[20];
}SB;

SB Set[20][4];

void Select(); /*选座位*/
void ShowList(); /*显示位置详细清单*/
void Menu(); /*菜单*/
int YNSelect(char *info,int cls); /*yes-No选择*/
void ShowNull(int window,int smoken); /*显示满足条件的位置索引*/
void InputInfo(); /*输入乘客资料*/
void baocun(int x,int y);


void main()
{
char key=0;
int Run=1;

memset(Set,0,80*sizeof(SB));
while(Run)
{
Menu();
key=getch();
switch(key)
{
case '1':Select();break;
case '2':ShowList();break;
case '3':Run=0;break;
}
}
}

int YNSelect(char *info,int cls)
{
char key;
if(cls) system("cls");
else printf("\n");
printf("\n%s Y/y - 要 N/n - 不要",info);
while(1)
{
key=getch();
if(key=='Y'||key=='y') return 1;
if(key=='N'||key=='n') return 0;
}
}
void ShowNull(int window,int smoken)
{
int i,j;
int Con1,Con2,Con3;
int count=0;

system("cls");
printf("符合你条件的座位有:\n\n");
for(j=0;j<20;j++)
for(i=0;i<4;i++)
{
Con1=((window==1)&&(i==0||i==3))||(window==0);
Con2=((smoken==1)&&(j>=19))||(smoken==0);
Con3=(Set[j][i].k==0);
if(Con1&&Con2&&Con3)
{
Set[j][i].n=0;
printf(" %2d%c ",j+1,'A'+i);
}
else
{
Set[j][i].n=1;
printf(" --- ");
}
count++;
if(count%4==0) printf("\n");
}
}
void Select()
{
char isWin=0;
char isSmk=0;
char isOK=0;

int LOOP=1;
while(LOOP)
{
isWin=YNSelect("要靠窗口边吗?",1);
isSmk=YNSelect("要吸烟吗?",1);
ShowNull(isWin,isSmk);
isOK=YNSelect("要选择位置吗?",0);
if(isOK==0)
LOOP=YNSelect("还要继续选吗?",0);
else
{
InputInfo();
LOOP=0;
}
}
}
void InputInfo()
{
char ch[10]={0};
int x,y;
int i=0;
printf("\n\n请输入座位编号:");
scanf("%s",ch);

while(i<10)
{
if(ch[i]<'0'||ch[i]>'9')
{
x=ch[i];
ch[i]=0;
break;
}
i++;
}

y=atoi(ch)-1;
if(x>='A'&&x<='D') x-='A';
else if(x>='a'&&x<='d') x-='a';
else x=-1;

if(y<0||y>19||x==-1)
{
printf("\n输入错误!!!按任意键返回");
getch();
return;
}
if(Set[y][x].n)
{
printf("\n不符和选择条件!按任意键返回");
getch();
}
else
{
printf("\n请输入姓名:");
scanf("%s",Set[y][x].Name);
printf("\n请输身份证号:");
scanf("%s",Set[y][x].Code);
Set[y][x].k=1;
printf("\n\n登记成功!\n\n%s同学,您的座位是:%2d%c.请准时登机",Set[y][x].Name,y+1,'A'+x);
baocun(x,y);
printf("\n\n按任意键返回");
getch();
}
}
void ShowList()
{
int i,j;
int count=0;

system("cls");
printf("\n整机位置分配状况清单:\n");
for(j=0;j<20;j++)
for(i=0;i<4;i++)
{
printf("\n %2d%c位置: ",j+1,'A'+i);
if(Set[j][i].k==0) printf("没人");
else printf("%s %s",Set[j][i].Name,Set[j][i].Code);
count++;
if(count%11==0)
{
printf("\n\n按ESC键返回,其他键继续.");
if(getch()==27) return;
system("cls");
printf("\n整机位置分配状况清单:\n");
}
}
printf("\n\n信息全部结束,按ESC键返回");
while(getch()!=27);
}
void baocun(int x,int y)
{

FILE *fp;
if((fp=fopen("乘客信息.txt","a+"))==NULL)
{
printf("文件不能打开!\n");
exit(0);
}

fprintf(fp,"%-20s%-20s%2d%c\n",Set[y][x].Name,Set[y][x].Code,y+1,'A'+x);
fclose(fp);
}
void Menu()
{
system("cls");
printf("\n 飞机票订票系统\n");
printf("\n 1 - 选择座位");
printf("\n 2 - 查看清单");
printf("\n 3 - 退出系统");
printf("\n\n 请选择\n");
}
...全文
125 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dxwsdosdo 2011-07-01
  • 打赏
  • 举报
回复
非常感谢、、、
ljhhh0123 2011-07-01
  • 打赏
  • 举报
回复
我在你的另一个同样的贴子里已经回答过了。
要想贴子留在第一屏,回复一下自己的贴子就好了。而不用重复提问。
dxwsdosdo 2011-06-30
  • 打赏
  • 举报
回复
上面的图片为 20a 上的客户 名字和身份证号截图 (查看清单选项)。。
dxwsdosdo 2011-06-30
  • 打赏
  • 举报
回复

我是想把保存函数 放在showlist 下,把读取函数也放在保存函数之前。这样在第二次运行时候还可以在 查看清单 项看到第一次运行客户在座位上存的信息。

不知道怎么才能行得通。麻烦再改下

使之能在第二次运行时 在 查看清单 项里面有内容(客户信息 名字、身份证号)。

比如说第一次运行
关了之后第二次运行20a上的那个信息还有。这样就好了。
gz_qmc 2011-06-30
  • 打赏
  • 举报
回复
搞错一个地方
fread(&SB,1,sizeof(SB),fp);
----->
fread(&Set,1,sizeof(SB)*80,fp);


fwrite(&SB,1,sizeof(SB),fp);
----->
fwrite(&Set,1,sizeof(SB)*80,fp);
dxwsdosdo 2011-06-30
  • 打赏
  • 举报
回复
该加的都加了
dxwsdosdo 2011-06-30
  • 打赏
  • 举报
回复
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"

typedef struct XXX
{
char k; /* 0表示无人,1表示有人 */
char n; /* 0表示可选,1表示不复合条件 */
char Name[30];
char Code[20];
}SB;

SB Set[20][4];

void Select(); /*选座位*/
void ShowList(); /*显示位置详细清单*/
void Menu(); /*菜单*/
int YNSelect(char *info,int cls); /*yes-No选择*/
void ShowNull(int window,int smoken); /*显示满足条件的位置索引*/
void InputInfo(); /*输入乘客资料*/
void Save();
void Load();


void main()
{
char key=0;
int Run=1;

memset(Set,0,80*sizeof(SB));
while(Run)
{
Menu();
key=getch();
switch(key)
{
case '1':Select();break;
case '2':ShowList();break;
case '3':Load();break; /*这是改的*/
case '4':Save();break; /*这是改的*/
case '5':Run=0;break; /*这是改的*/
}
}
}

int YNSelect(char *info,int cls)
{
char key;
if(cls) system("cls");
else printf("\n");
printf("\n%s Y/y - 要 N/n - 不要",info);
while(1)
{
key=getch();
if(key=='Y'||key=='y') return 1;
if(key=='N'||key=='n') return 0;
}
}
void ShowNull(int window,int smoken)
{
int i,j;
int Con1,Con2,Con3;
int count=0;

system("cls");
printf("符合你条件的座位有:\n\n");
for(j=0;j<20;j++)
for(i=0;i<4;i++)
{
Con1=((window==1)&&(i==0||i==3))||(window==0);
Con2=((smoken==1)&&(j>=19))||(smoken==0);
Con3=(Set[j][i].k==0);
if(Con1&&Con2&&Con3)
{
Set[j][i].n=0;
printf(" %2d%c ",j+1,'A'+i);
}
else
{
Set[j][i].n=1;
printf(" --- ");
}
count++;
if(count%4==0) printf("\n");
}
}
void Select()
{
char isWin=0;
char isSmk=0;
char isOK=0;

int LOOP=1;
while(LOOP)
{
isWin=YNSelect("要靠窗口边吗?",1);
isSmk=YNSelect("要吸烟吗?",1);
ShowNull(isWin,isSmk);
isOK=YNSelect("要选择位置吗?",0);
if(isOK==0)
LOOP=YNSelect("还要继续选吗?",0);
else
{
InputInfo();
LOOP=0;
}
}
}
void InputInfo()
{
char ch[10]={0};
int x,y;
int i=0;
printf("\n\n请输入座位编号:");
scanf("%s",ch);

while(i<10)
{
if(ch[i]<'0'||ch[i]>'9')
{
x=ch[i];
ch[i]=0;
break;
}
i++;
}

y=atoi(ch)-1;
if(x>='A'&&x<='D') x-='A';
else if(x>='a'&&x<='d') x-='a';
else x=-1;

if(y<0||y>19||x==-1)
{
printf("\n输入错误!!!按任意键返回");
getch();
return;
}
if(Set[y][x].n)
{
printf("\n不符和选择条件!按任意键返回");
getch();
}
else
{
printf("\n请输入姓名:");
scanf("%s",Set[y][x].Name);
printf("\n请输身份证号:");
scanf("%s",Set[y][x].Code);
Set[y][x].k=1;
printf("\n\n登记成功!\n\n%s同学,您的座位是:%2d%c.请准时登机",Set[y][x].Name,y+1,'A'+x);
Save();
printf("\n\n按任意键返回");
getch();
}
}
void ShowList()
{
int i,j;
int count=0;

system("cls");
printf("\n整机位置分配状况清单:\n");
for(j=0;j<20;j++)
for(i=0;i<4;i++)
{
printf("\n %2d%c位置: ",j+1,'A'+i);
if(Set[j][i].k==0) printf("没人");
else printf("%s %s",Set[j][i].Name,Set[j][i].Code);
count++;
if(count%11==0)
{
printf("\n\n按ESC键返回,其他键继续.");
if(getch()==27) return;
system("cls");
printf("\n整机位置分配状况清单:\n");
}
}
printf("\n\n信息全部结束,按ESC键返回");
while(getch()!=27);
}
void Load();/*装载数据*/
{
FILE *fp=fopen("乘客信息.txt","rb");
if(NULL==fp)
{
printf("\n 数据文件不存在");
return;
}
fread(&SB,1,sizeof(SB),fp);
fclose(fp);
}
void Save();/*保存数据*/
{
FILE *fp=fopen("乘客信息.txt","wb");
if(NULL==fp)
{
printf("\n 磁盘保护");
return;
}
fwrite(&SB,1,sizeof(SB),fp);
fclose(fp);
}
void Menu()
{
system("cls");
printf("\n 飞机票订票系统\n");
printf("\n 1 - 选择座位");
printf("\n 2 - 查看清单");
printf("\n 3 - 装载数据");
printf("\n 4 - 保存数据");
printf("\n 5 - 退出系统");
printf("\n\n 请选择\n");
}




HAISHI
dxwsdosdo 2011-06-30
  • 打赏
  • 举报
回复
还是有错误 请指正 、、
gz_qmc 2011-06-30
  • 打赏
  • 举报
回复
好人做到低吧,下面是加了的

void Load();/*装载数据*/  
{
FILE *fp=fopen("乘客信息.txt","rb");
if(NULL==fp)
{
printf("\n 数据文件不存在");
return;
}
fread(&SB,1,sizeof(SB),fp);
fclose(fp);
}
void Save();/*保存数据*/
{
FILE *fp=fopen("乘客信息.txt","wb");
if(NULL==fp)
{
printf("\n 磁盘保护");
return;
}
fwrite(&SB,1,sizeof(SB),fp);
fclose(fp);
}
dxwsdosdo 2011-06-30
  • 打赏
  • 举报
回复
保存函数就上面的 但就是那个读取函数不会啊 、、求教
gz_qmc 2011-06-30
  • 打赏
  • 举报
回复
void main()
{
char key=0;
int Run=1;

memset(Set,0,80*sizeof(SB));
while(Run)
{
Menu();
key=getch();
switch(key)
{
case '1':Select();break;
case '2':ShowList();break;
case '3':读取();break; /*这是改的*/
case '4':保存();break; /*这是改的*/
case '5':Run=0;break; /*这是改的*/
}
}
}


菜单也要改一下
void Menu()
{
system("cls");
printf("\n 飞机票订票系统\n");
printf("\n 1 - 选择座位");
printf("\n 2 - 查看清单");
printf("\n 3 - 装载数据");
printf("\n 4 - 保存数据");
printf("\n 5 - 退出系统");
printf("\n\n 请选择\n");
}


剩下的就是自己写个保存函数和读取函数填进去就好了
dxwsdosdo 2011-06-30
  • 打赏
  • 举报
回复
en 就是啊 大侠 但少这个功能,能不能给加上
gz_qmc 2011-06-30
  • 打赏
  • 举报
回复
这他奶奶的不是我原创的吗?晕死

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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