C语言课设 从文件读取时遇到的问题

生嚼大蒜咔咔咔 2018-07-02 11:03:24
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#define N 500
struct tele
{
char client_name[30];
char client_gender[10];
char client_address[50];
char client_telephone[15];
};
struct tele telephone[N];
int cur=0;
void press();
void show();
void input(struct tele *s);
int amend(struct tele *s);
int delete_client(struct tele *s);
int demand_client(struct tele *s);
void collect_client(struct tele *s);
void sort(struct tele *s);
int save(struct tele *read,int cur);
int read(struct tele *read);
int main()
{
char choice;
while(1)
{
show();
fflush(stdin);
choice=getchar();
switch(choice)
{
case '1':input(telephone);break;
case '2':amend(telephone);break;
case '3':delete_client(telephone);break;
case '4':demand_client(telephone);break;
case '5':collect_client(telephone);break;
case '6':sort(telephone);break;
case '7':read(telephone);break;
case '8':save(telephone,cur);exit(0);
}
getch();

}
return 0;
}
void press()
{
printf("按任意键以继续\n");
getch();
}
void show()
{
system("cls");
printf("欢迎使用通讯录管理系统!\n");
printf("*********************************************************************************************\n");
printf("\t\t\t\t\t1:添加联系人\n\t\t\t\t\t2:修改联系人信息\n\t\t\t\t\t3:删除联系人\n\t\t\t\t\t4:按需查询联系人信息\n\t\t\t\t\t5:联系人信息汇总\n\t\t\t\t\t6:排序(按姓名)\n\t\t\t\t\t7:从文件中读取\n\t\t\t\t\t8:退出\n");
printf("*********************************************************************************************\n");putchar(10);putchar(10);
printf("请输入选择:");
}

int save(struct tele *read,int cur)
{
FILE *fp ;
int z=0;
if((fp=fopen("通讯录.txt" , "w" ))==NULL)
{
printf("error when opening");
return -1 ;
}
fprintf(fp,"%d",cur);
fwrite(read , sizeof(struct tele), cur , fp ); //将数组写入文件
fclose(fp);
fp=NULL;
}

int read(struct tele *read)
{
int i=0;
FILE *fp;
if((fp=fopen("通讯录.txt" , "rb" ))==NULL)
{
printf("error when opening");
exit(0);
}
fscanf(fp,"%d",cur);
for(i=0;i<cur;i++)
{
fread(read,sizeof(struct tele),cur,fp);
}
press();
return 0;
}

void input(struct tele *s)
{
if(cur==N-1)
{
printf("容量已满,无法存储");
return;
}
else
{
printf("请输入联系人姓名、性别(man/woman)、地址与电话号码(信息间以空格隔开):\n");
fflush(stdin);
scanf("%s%s%s%s",s[cur].client_name,s[cur].client_gender,s[cur].client_address,s[cur].client_telephone);
cur++;

}
printf("Done!\n");
press();
}
int amend(struct tele *s)
{
int i=0;
char str[30];
printf("请输入需要修改的联系人姓名:\n");
fflush(stdin);
gets(str);
while(strcmp(s[i].client_name,str)!=0&&i<=cur)
i++;
if(i>cur)
{
printf("该联系人不存在,请检查您输入的信息\n");
return 0;
}
system("cls");
printf("请确认修改前信息:\n");
printf("姓名\t\t%s\n",s[i].client_name);
printf("性别\t\t%s\n",s[i].client_gender);
printf("地址\t\t%s\n",s[i].client_address);
printf("电话\t\t%s\n",s[i].client_telephone);

printf("请输入修改后的联系人姓名、地址和电话号码(信息间以空格隔开):\n");
fflush(stdin);
scanf("%%s%s%s",s[i].client_name,s[i].client_address,s[i].client_telephone);
printf("Done!\n");
press();
return 1;
}
int delete_client(struct tele *s)
{
int j,i=0;
char str[30];
printf("请输入需要删除的联系人姓名:");
fflush(stdin);
gets(str);
while(strcmp(s[i].client_name,str)!=0&&i<=cur)
i++;
if(i>cur)
{
printf("联系人不存在,请检查您输入的信息");
return 0;
}
for(j=i+1;j<=cur;j++)
s[j-1]=s[j];
cur--;
printf("Done!\n");
press();
return 1;
}

int demand_client(struct tele *s)
{
int men,i=0;
char str[30],ch;
printf("**1:按姓名查找\n**2:按电话号码查找\n:");
fflush(stdin);
scanf("%d",&men);
switch(men)
{
case 1:
printf("请输入联系人姓名:\n");
fflush(stdin);
scanf("%s",str);
while(strcmp(s[i].client_name,str)!=0&&i<=cur)
i++;
if(i>cur)
{
printf("联系人不存在,请检查您输入的信息\n");
return 0;
}
printf("姓名\t\t%s\n",s[i].client_name);
printf("性别\t\t%s\n",s[i].client_gender);
printf("地址\t\t%s\n",s[i].client_address);
printf("电话\t\t%s\n",s[i].client_telephone);
break;
case 2:
printf("请输入联系人电话号码:\n");
fflush(stdin);
scanf("%s",str);
while(strcmp(s[i].client_telephone,str)!=0&&i<=cur)
i++;
if(i>cur)
{
printf("联系人不存在,请检查您输入的信息\n");
return 0;
}
printf("姓名\t\t%s\n",s[i].client_name);
printf("性别\t\t%s\n",s[i].client_gender);
printf("地址\t\t%s\n",s[i].client_address);
printf("电话\t\t%s\n",s[i].client_telephone);
break;
default:break;
}
putchar(10);
press();
return 1;
}
void collect_client(struct tele *s)
{
int i;
for(i=0;i<cur;i++)
{
printf("姓名\t\t%s\n",s[i].client_name);
printf("性别\t\t%s\n",s[i].client_gender);
printf("地址\t\t%s\n",s[i].client_address);
printf("电话\t\t%s\n",s[i].client_telephone);
putchar(10);
}
printf("\n");
press();
return ;
}
void sort(struct tele *s)
{
struct tele a;
int i,j;
for(i=0;i<cur;i++)
for(j=i+1;j<=cur;j++)
if(strcmp(s[i].client_name,s[j].client_name)>0)
{
a=s[i];
s[i]=s[j];
s[j]=a;
}
printf("Done!\n");
press();
return ;
}


在从文件中读取时遇到了问题
图一是正常时出现的画面

图二问题出现


函数read功能设想是从文件中读取数据,并存入结构数组中,之后返回主函数继续选择
正常应当返回主函数 但是选择 7 时,程序直接退出
应当如何修改
...全文
149 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2018-07-02
  • 打赏
  • 举报
回复
int read(struct tele *read)
{
int i=0;
FILE *fp;
if((fp=fopen("通讯录.txt" , "rb" ))==NULL)
{
printf("error when opening");
exit(0);
}
//fscanf(fp,"%d",cur);
fscanf(fp,"%d", &cur);
fread(read,sizeof(struct tele),cur,fp);
/*
for(i=0;i<cur;i++)
{
fread(read,sizeof(struct tele),cur,fp);
}
*/
press();
return 0;
}

read函数有问题,另外,函数名最好不要和变量(参数)名相同,否则有些编译器不是别和代码也不好阅读。
建议对比代码找一下原因
******************* 实践教学 ******************* 理工大学 计算机与通信学院 2011年春季学期 C程序设计 课程设计 题 目: 专业班级: 姓 名: 学 号: 指导教师: 成 绩:__________________ 摘 要 在车辆销售管理当中,人工统计的速度慢,并且容易出现差错。本车辆销售管理系统的自动化加速了统计工作,提高管理效率。本程序主要采用对输入的相关信息进行自动分析,然后按组分类将数据保存到数组,这样的结构化非常便于程序后续的统计工作。统计具体过程涉及到车辆进价售价及利润排序等问题,将于正文中详细介绍。本程序实现了所有设计要求。 关键词:文件;排序;统计;C语言 目 录 一、需求分析 1 二、总体设计 2 三、详细设计 3 3.1 详细设计思路 3 3.2 算法流程图 3 四、编码 7 五、测试 8 六、设计总结 12 参考文献 13 致谢 14 附录 15 一、需求分析 本程序将用到文件系统,list.txt文件内容作为数据源,其中单行内容代表一张纸条。程序运行后首先将文件系统的原始数据读取并保存到程序的结构体数组当中,所以应提供文件输入的操作;由于纸条数据零散,所以要对原始数据进行分类操作并提供一个数组用于保存分类信息;在程序中要进行统计工作,所以要提供显示、排序等操作;另外应提供键盘式选择菜单实现功能选择。 二、总体设计 图1 车辆销售管理系统功能模块图 三、详细设计 3.1 详细设计思路 1.main()主函数 设置了程序的流程,结束程序。 2.select ( ) 选择函数 选择所想运行的各个函数. 3.functionscan ( ) 输入函数输入便条的数据. 4.function1 ( ) 文件的数据输入函数多次输入数据 5. function2 ( ) 统计函数每种汽车销售量以及销售额的统计 6. functionpaixu2 ( )总额排序函数按销售额对汽车进行排序 7. function4() 总额统计函数统计每种汽车的总额 8. function5() 统计报表函数统计商品总额 9. function6() 清空文件函数 清空文件数据 3.2 算法流程图 3.2.1保存函数Save()的算法流程图如图2所示。 图2 保存函数Save()的算法流程图 3.2.2输入函数input()的算法流程图如图3所示。 图3 输入函数的算法流程图 3.2.3 输出汽车信息 图4 输出汽车信息 四、编码 原始数据有汽车编码,车名,进价,售价,销售数量。年所以定义一个全局结构体数组scrip用于保存原始数据。然后定义全局变量n保存纸条数目,定义数组s用于保存分类后的信息。源代码见附录 五、测试 1输入新数据测试如图5所示 图5 输入新数据测试 2按车名查找数据测试如图6所示 图6按车名查找数据测试 3按编号查找数据测试如图7所示 图7 按编号查找数据测试 4按车辆名称删除数据测试如图8所示 图8车辆名称删除数据测试 5列出所有数据测试如图9所示 图9列出所有数据测试 6统计各产品的收益和总收益测试如图10所示 图10统计各产品的收益和总收益测试 7按车辆销售额的大小排序并输出排序后结果测试如图11所示 图11按车辆销售额的大小排序并输出排序后结果测试 六、设计总结 通过这次C程序设计,我掌握了模块化设计方法,能够深入的理解结构化程序设计思想,熟练运用结构化程序设计方法,提高了运用C语言进行程序设计的能力。 回顾起这次课程设计,至今我仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,可以学到很多的东西。同不仅可以巩固了以前所学到的知识,而且学到了很多在书本上所没有学到过的知识,通过这次课程设计使我懂得了理论与实际相结合是很重要的。只有理论知识是远远不够的,只有把所学的理论知识与实际相结合起来,从理论中得出结论。才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,通过同学的帮助,逐渐克服各种问题,并且从中学习到了很多的东西。通过这次编程。我发现了很多的不足。让我了解到自身的问题。让我不断的进步。 参考文献 1 C/C++程序设计,王连相等,中国科学技术出版社,2004 2 C语言程序设计,谭浩强,清华大学出版社,1999 3 C程序设计题解与上机指导,谭浩强,清华大学出版社,1999 4 C语言实用程序荟萃,西安电子科技大学出版社,1993 5 C语言函数手册,机械工业出版社,1999

69,373

社区成员

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

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