C语言编程文本保存问题。。高分悬赏
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言编程文本保存问题。。高分悬赏相关的知识,希望对你有一定的参考价值。
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define MAX 100
typedef struct student
char num[11];
int math;
int eng;
int chin;
int ave;
int totle;
stu;
void main()
stu a[MAX];
int i=0,n=0,k;
FILE *fp;
if((fp=fopen("e:\\student.txt","a+"))==NULL)
printf("open file error!\n");
exit(0);
for(i=0;fread(&a[i],sizeof(stu),1,fp)!=0;i++)
n=i;
printf("请输入要添加的信息");
printf("\n请输入第%d个学生信息:\n",n+1);
printf("学号:\n");
scanf("%s",a[n].num);
printf("math成绩:\n");
scanf("%d",&a[n].math);
printf("english成绩:\n");
scanf("%d",&a[n].eng);
printf("chin成绩:\n");
scanf("%d",&a[n].chin);
a[n].totle=a[n].math+a[n].eng+a[n].chin;
a[n].ave=a[n].totle/3;
for(k=n-1;k>=0;k--)
if(strcmp(a[k].num,a[n].num)==0)
rintf("该学生已经存在,请重新输入");
break;
if((fp=fopen("e:\\student.txt","wb"))==NULL)
printf("open file error!\n");
exit(0);
for(i=0;i<n;i++)
fwrite(&a[i],sizeof(a[0]),1,fp);
fclose(fp);
首先,第一个for函数就有问题。按我的理解,你应该在一对花括号。应该在n=i前加 ,在break后再追加一个 。这样才能实现对多个数据的输入,否则一直执行
for(i=0;fread(&a[i],sizeof(stu),1,fp)!=0;i++) n=i; 至到fread(&a[i],sizeof(stu),1,fp)==0时。再执行下面的语句。还有判断是否此人已经输入了,函数名写错了 rintf ,应该是printf。还有程序还个缺点,此程序还确实一个结束录入的语句,不然要一直录入,直到
fp=fopen("e:\\student.txt","wb")==0时才结束,而且不能正确保存信息。还有最后一个if语句也有错,
fp=fopen("e:\\student.txt","wb")也有问题。此语句应该是为后面输出学生信息,为读做准备,应该改为
fp=fopen("e:\\student.txt","rb")。另外还有个小瑕疵,平均分不一定整数,应该写为float,除的时候应该除3.0。我没有编辑器,修改的不知道到结果怎么样了,目前我还没有发现其他大问题。说句题外话,main函数太复杂,需要简化,你应该多调用函数来实现。实现同样功能的程序,最简单的才是最好的。希望我说的对你有用追问
谢谢。。可以保存了。。。但是出现的是乱码。。。还有for(i=0;fread(&a[i],sizeof(stu),1,fp)!=0;i++) n=i; 这一句好像无法计算文件中总共存有多少个,每次执行都是现显示n=0,还有可是麻烦说下那个结束录入语句要怎样,
0309101010蘗 : W N ? 这是存进去后乱码的情况
#include
#include
#include
#define MAX 100
typedef struct student
char num[10];
int math;
int eng;
int chin;
float ave;
int totle;
stu;
void main()
stu a[MAX];
int i=0,n=0,k,m;
FILE *fp;
if((fp=fopen("e:\\student.txt","wb"))==NULL)
printf("open file error!\n");
exit(0);
printf("请输入要录入信息的人数(小于101):");
scanf("%d",&m);
for(i=0;i0;k--)
if(strcmp(a[k].num,a[n].num)==0)
printf("该学生已经存在,请重新输入");
i-- ;/*用来覆盖原来那个相同的*/
break;
for(i=0;i<n+1;i++)
printf("%-6s%5d%5.1f",a[i].num,a[i].totle,a[i].ave);
printf("\n");
fclose(fp);
我没有运行过,你自己试试吧
读取,文件是用a+方式打开,这读取数据,因为文件指针在最末的关系,读取出来的数据是空的,所以n永远为0。
其次,在写数据前,没有fclose文件就再fopen一次,这是正确的文件操作方式?
最后,老实说,看你的代码头很痛,不是说代码很难,而是这个格式实在太难看,很多时候,一看到这种混乱的代码,直接看都不看就关掉的。在诸多IDE的今天,写一段格式整齐的代码很难么,不要跟我说你是用windows记事本写代码的。
最最后,下面是整理并修改正确的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifndef MAX_NUM
#define MAX_NUM 100
#endif
typedef struct student
char num[11];
int math;
int eng;
int chin;
int ave;
int totle;
stu;
void main()
stu a[MAX_NUM];
int i = 0, n = 0, k = 0;
FILE *fp = fopen("e:\\student.txt","rb+");
for(n = 0; fp && fread(&a[n], 1, sizeof(stu), fp) != 0; ++n) ;
printf("请输入要添加的信息");
printf("\n请输入第%d个学生信息:\n",n + 1);
printf("学号:\n");
scanf("%s",a[n].num);
printf("math成绩:\n");
scanf("%d",&a[n].math);
printf("english成绩:\n");
scanf("%d",&a[n].eng);
printf("chin成绩:\n");
scanf("%d",&a[n].chin);
a[n].totle=a[n].math+a[n].eng+a[n].chin;
a[n].ave=a[n].totle/3;
for(k = n-1; k >= 0; k--)
if(strcmp(a[k].num,a[n].num) == 0)
printf("该学生已经存在,请重新输入");
break;
if(fp == NULL && (fp = fopen("e:\\student.txt","wb")) == NULL)
printf("open file error!\n");
exit(0);
fseek(fp, 0, SEEK_SET);
for(i = 0; i <= n; i++)
fwrite(&a[i], 1, sizeof(a[0]), fp);
fclose(fp);
追问
真的非常感谢。。。。由于还算是初学者还在学习中。。。。会慢慢改进的。。。多谢指导。。。不过那个存进去为什么成绩存进去的是乱码 存进文本的内容如下
0309101201 蘗 X W X 麻烦再指导下哦
因为使用"wb"方式打开文件再写入的原因,如果要不乱码文本,需要修改读写的逻辑,比现在会麻烦很多。要将每个struct的字段按一定的规则读写才行。
本回答被提问者采纳 参考技术B char name[15]; /*姓名*/float jbgz; /*基本工资*/
float koukuan; /*扣款*/
float yfgz; /*应发工资*/
float shuijin; /*税金*/
float sfgz; /*实发工资*/
struct z1 *prior;/*前驱指针*/
struct z1 *next;/*后继指针*/
SALARY; /*结构体类型名*/
struct z1 *First; /*双链表头指针*/
struct z1 *Last; /*双链表尾指针*/
/******函数原型*********/
void init(); /*初始化*/
void create(); /*创建链表*/
void calc(); /*计算应发工资*/
void delete(); /*删除*/
void search(); /*查找*/
void save(); /*保存文件*/
void load(); /*读取文件*/
void computer(); /*计算所需各种票面张数*/
void insert(); /*插入*/
void append(); /*追加*/
void copy(); /*复制文件*/
void sort(); /*排序*/
void index(); /*索引*/
void total(); /*分类合计*/
void list(); /*显示所有数据*/
void print(SALARY *p); /*输出单条记录*/
void display(); /*随意逐条显示*/
float fax(float x); /*计算税金*/
int menu_select(); /*主菜单*/
/*******主函数开始**********/
main()
int i;
clrscr();
for(;;)
switch(menu_select()) /*调用菜单函数返回一个整数值*/
case 0:init();break; /*初始化*/
case 1:create();break; /*输入数据创建双链表*/
case 2:list();break; /*显示所有数据*/
case 3:display();break; /*单条显示*/
case 4:calc();break; /*计算实发工资*/
case 5:search();break; /*查找职工信息数据*/
case 6:delete();break; /*删除记录*/
case 7:insert();break; /*插入记录*/
case 8:append();break; /*追加记录*/
case 9:save();break; /*保存文件*/
case 10:load(); break; /*读取文件*/
case 11:copy();break; /*复制文件*/
case 12:sort();break; /*按实发工资升序排序*/
case 13:computer();break; /*计算所需票面数*/
case 14:index();break; /*按职工号索引*/
case 15:total();break; /*按部门求合计*/
case 16:exit(0); /*退出*/
/*菜单函数,函数返回值为整型,代表所选的菜单项*/
menu_select()
char *f[]= /*定义菜单字符串数组*/
"**************MENU*************", /*菜单的标题行*/
" 0. init list", /*初始化双链表*/
" 1. Enter list", /*输入数据,创建双链表*/
" 2. List all \n", /*显示所有记录*/
" 3. Display record by step", /*显示单条记录*/
" 4. Calc the salary", /*计算实发工资*/
" 5. Search record on name", /*查找记录*/
" 6. Delete a record", /*删除记录*/
" 7. Insert record to list", /*插入记录*/
" 8. Append record to file", /*追加记录*/
" 9. Save data to the file", /*保存文件*/
" 10. Load data from the file",/*读取文件*/
" 11. Copy the file to new file", /*复制文件*/
" 12. Sort on sfgz", /*排序*/
" 13. Computer ticket number", /*计算所需票面数*/
" 14. Index on number", /*索引*/
" 15. Total on number", /*分类合计*/
" 16. Quit" ; /*退出*/
char s[80];
int i;
int key=0; /*记录所压键值*/
int c=0;
gotoxy(1,25); /*移动光标*/
printf("press any key enter menu......\n");/*压任意键进入主菜单*/
getch();
clrscr(); /*清屏*/
textcolor(YELLOW); /*设置文本颜色为黄色*/
textbackground(BLUE); /*设置背景颜色为兰色*/
gotoxy(10,2);
putch(0xda); /*输出左上角边框┏*/
for(i=1;i<44;i++)
putch(0xc4); /*输出上边框水平线*/
putch(0xbf); /*输出右上角边框 ┓*/
for(i=3;i<22;i++)/*输出左右两边的垂直线*/
gotoxy(10,i);putch(0xb3);
gotoxy(54,i);putch(0xb3);
gotoxy(10,22);putch(0xc0); /*输出左上角边框┗*/
for(i=1;i<44;i++)
putch(0xc4); /*输出下边框水平线*/
putch(0xd9); /*输出右下角边框┛*/
window(11,3,53,21); /* 制作显示菜单的窗口,大小根据菜单条数设计*/
clrscr(); /*清屏*/
for(i=0;i<18;i++)
gotoxy(10,i+1);
cprintf("%s",f[i]); /*输出菜单项数组*/
i=1;
gotoxy(10,2); /*设置默认选项在第一项*/
textbackground(LIGHTGREEN);/*设置背景颜色为浅绿*/
cprintf("%s",f[1]); /*输出菜单项,表示选中*/
gotoxy(10,2); /*移动光标到菜单的第一项*/
while(key!=13) /*所压键不是回车键时*/
while(bioskey(1)==0); /*查询是否压下了一个键*/
key=bioskey(0); /*返回下一个在键盘压下的键*/
key=key&0xff?key&0xff:key>>8; /*对所压的键进行判断*/
gotoxy(10,i+1);
textbackground(BLUE);/*设置背景颜色为蓝色*/
cprintf("%s",f[i]); /*输出菜单项*/
if(key==72) i=i==1?17:i-1; /*如压向上光标键↑,i减1,如已到第一行再上移,则到最后一行*/
if(key==80)i=i==17?1:i+1; /*如压向下光标键↓,i加1,如已到最后一行再下移,则到第一行*/
gotoxy(10,i+1); /*光标移动i的下一项*/
textbackground(LIGHTGREEN); /*将背景颜色设为浅绿*/
cprintf("%s",f[i]); /*输出菜单项*/
c=i-1; /*给代表菜单选项的整数赋值*/
textbackground(BLACK); /*设置背景颜色为黑色*/
window(1,1,80,25); /*恢复原窗口大小*/
return c; /*返回代表菜单选项的整数值*/
/*初始化函数*/
void init()
First=NULL;
Last=NULL;
/*输入数据,创建双链表*/
void create()
int x; /*记录行坐标*/
int i; /*记录输入记录数*/
int flag=0; /*做结束标记*/
float temp; /*定义临时变量*/
SALARY *info,*p; /*定义临时变量*/
if(First!=NULL)
init();/*如果头指针为空,调用初始化函数*/
p=First; /*从头指针开始*/
for(;;)
if(flag==1)
break; /*如果flag=1,结束输入*/
i=0;
x=0; /*确定移动的行坐标*/
clrscr(); /*清屏*/
gotoxy(1,3);
printf("*************gongziguanli*************");/*输出标题*/
gotoxy(1,4);
printf(" --Enter @ end--");/*提示输入@结束*/
gotoxy(1,5);
printf("|------------------------------------|");/*输出表格的起始线*/
gotoxy(1,6);
printf("| no | name | jbgz |");/*输出字段标题,注意空格数*/
for(;;)
gotoxy(1,7+x);
printf("|----------|----------------|--------|");/*输出表格的水平线*/
info=(SALARY *)malloc(sizeof(SALARY));/*申请一个记录空间*/
if(!info)
printf("\nout of memory");/*如没有得到空间,输出内存溢出信息*/
exit(0);/*退出程序*/
info->next=NULL;/*新结点的后继为空*/
info->prior=NULL;/*新结点的前驱为空*/
gotoxy(1,8+x);printf("|"); /*输出数据间的分割线*/
gotoxy(12,8+x);printf("|");
gotoxy(29,8+x);printf("|");
gotoxy(38,8+x);printf("|");
gotoxy(2,8+x);/*光标到输入编号位置*/
inputs(info->no,10);/*输入编号,并验证长度不超过10*/
if(info->no[0]=='@')
flag=1;
break;
/*编号首字符为@结束输入*/
gotoxy(13,8+x); /*光标到输入姓名位置*/
inputs(info->name,14); /*输入姓名,并验证长度不超过14*/
gotoxy(30,8+x); /*光标到输入基本工资位置*/
scanf("%f",&temp); /*输入基本工资到临时变量*/
info->jbgz=temp; /*基本工资赋值*/
info->koukuan=0; /*初始扣款为0,待计算工资时输入*/
info->sfgz=0; /*初始实发工资为0,待计算工资时计算*/
info->shuijin=0; /*初始税金为0,待计算工资时计算*/
info->yfgz=0; /*初始应发工资为0,待计算工资时计算*/
if(p==NULL)/*如果p为空,说明输入的是第一个结点*/
First=Last=info;/*头指针和尾指针*/
First->prior=NULL; /*头指针的前驱是空*/
Last->next=NULL; /*尾指针的后继是空*/
else /*插入的结点不是第一结点,则插入在头结点之前*/
info->next=p;/*新结点的后继指向原来的头结点*/
info->prior=p->prior;/*新结点的前驱指向原来的头结点的前驱*/
p->prior=info;/*原来结点的前驱指向新结点*/
p=info; /*新结点变为p结点,暂时的头结点*/
First=info; /*新结点变为头结点*/
x+=2; /*因为水平线,将光标下移两行*/
gotoxy(1,8+x);
i++; /*输入记录数加1*/
if(i%9==0)
break; /*输入9个记录,换一页输入*/
gotoxy(1,8+x);
printf("|----------|----------------|--------|");/*输出结尾水平线*/
/*字符串输入和验证函数*/
inputs(char *s, int count)
char p[255];
do
scanf("%s",p);/*输入字符串*/
if(strlen(p)>count)printf("\n too long! \n");/*进行长度校验,超过count值重输入*/
while(strlen(p)>count);
strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/
/*显示链表*/
void list()
int i=0,n; /*记录输出行数*/
SALARY *p; /*定义移动指针*/
clrscr(); /*清屏*/
p=First; /*从头指针开始*/
while(i%10==0&&p!=NULL) /*外循环控制换页*/
i=0; /*记录一页的输出行数*/
clrscr(); /*清屏*/
printf("\n\n\n"); /*换行三次*/
printf("*************************************SALARY***********************************\n"); /*输出大标题*/
printf("|nO | name | jbgz | koukuan | yfgz | shuijin | sfgz |\n"); /*输出字段标题*/
printf("|----------|---------------|---------|---------|---------|---------|---------|\n"); /*输出水平线*/
while(p!=NULL) /*当p不为空时*/
printf("|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|\n",
p->no,p->name,p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);
p=p->next; /*指针后移*/
i++; /*输出行数加1 */
if(i%10==0)
break; /*如果满10行,跳出内循环*/
printf("****************************************end***********************************\n"); /*输出本页的结束行*/
printf("Press any key congtinue...\n");
getch(); /*输出一页暂停一下,压任意键继续*/
/*返回到外循环,准备下一页的输出*/
/*单条显示记录*/
void display()
int ch; /*菜单选项字符*/
SALARY *p; /*定义临时指针*/
clrscr(); /*清屏*/
p=First; /*从头指针开始*/
if(p==NULL) /*指针为空,即链表为空,返回主函数*/
printf("record is empty!\n");
return;
else
print(p); /*调用输出函数显示头结点信息*/
for(;;) /*循环开始*/
printf("\n\n0. Quit 1. Prior 2. Next 3. First 4.Last \n\n");
/*菜单项Quit退出 Prior前驱 Next后继 First第一条 Last最后一条*/
printf("\nplease select 0~4:"); /*提示输入菜单选项0~4*/
scanf("%d",&ch); /*输入菜单选项0~4*/
if(ch==0) break; /*如果选项为0,退出*/
switch(ch) /*开关语句根据选项字符判断*/
case 1:p=p->prior;if(p==NULL)p=First;break; /*指向前驱,没有前驱指向第一个*/
case 2:p=p->next;if(p==NULL) p=Last;break; /*指向后继,没有后继指向最后一个*/
case 3:p=First;break; /*指向第一个结点*/
case 4:p=Last;break; /*指向最后一个结点*/
print(p); /*调用输出函数显示指针所指结点信息*/
/*输出指针所指结点信息*/
void print(SALARY *p)
if(p) /*如果指针不为空,则显示信息*/
clrscr(); /*清屏*/
printf("\n\n\n"); /*换行*/
printf("************************************SALARY************************************\n"); /*输出标题信息*/
printf("|no | name | jbgz | koukuan| yfgz | shuijin | sfgz |\n"); /*输出字段标题*/
printf("|----------|---------------|---------|---------|---------|---------|---------|\n"); /*输出分割线*/
printf("|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|\n", p->no,p->name,
p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);/*输出结点信息*/
printf("***************************************end***************************** *******\n"); /*输出结束标记*/
/*计算实发工资*/
void calc()
int x; /*行坐标*/
int i=0; /*记录数*/
float temp; /*临时变量扣款*/
SALARY *p; /*移动指针*/
clrscr(); /*清屏*/
p=First; /*从头指针开始*/
while(p!=NULL) /*当p不为空时,也就是有记录时,外循环控制换页*/
x=0;
clrscr();
gotoxy(1,3);
printf("***************************gongziguanli************************************"); /*输出标题*/
gotoxy(1,5);
printf("|--------------------------------------------------------------------------|");
gotoxy(1,6);/*下面输出字段标题*/
printf("| no | name | jbgz | koukuan | yfgz |shuijin | sfgz |");
while(p!=NULL) /*当p不为空时,也就是有记录时,内循环控制处理9条*/
gotoxy(1,7+x);
printf("|----------|----------------|--------|----------|--------|--------|--------|");
gotoxy(1,8+x);printf("|");
gotoxy(12,8+x);printf("|");
gotoxy(29,8+x);printf("|");
gotoxy(38,8+x);printf("|");
gotoxy(49,8+x);printf("|");
gotoxy(58,8+x);printf("|");
gotoxy(67,8+x);printf("|");
gotoxy(76,8+x);printf("|");
gotoxy(2,8+x);
printf("%-10s",p->no); /*输出编号*/
gotoxy(13,8+x);
printf("%-15s",p->name); /*输出姓名*/
gotoxy(30,8+x);
printf("%.2f",p->jbgz); /*输出基本工资*/
gotoxy(39,8+x);
scanf("%f",&temp); /*输入扣款*/
p->koukuan=temp; /*扣款字段赋值*/
p->yfgz=p->jbgz-p->koukuan; /*计算应发工资=基本工资-扣款*/
gotoxy(50,8+x);
printf("%.2f",p->yfgz); /*输出应发工资*/
gotoxy(59,8+x);
p->shuijin=(p->yfgz-1000)*fax(p->yfgz); /*否则按税率计算税金*/
printf("%.2f",p->shuijin); /*输出税金*/
gotoxy(68,8+x);
p->sfgz=p->yfgz-p->shuijin; /*计算实发工资*/
printf("%-8.2f",p->sfgz); /*输出实发工资*/
x+=2; /*行坐标下移两行*/
i++; /*记录数加1*/
if(i%9==0)break; /*记录数超过9条,跳出内循环*/
p=p->next; /*指针后移,处理下一条*/
gotoxy(1,7+x);
printf("|----------|----------------|--------|----------|--------|--------|--------|\n"); /*输出结束行*/
printf("Press any key congtinue...\n");
getch();
/*根据应发工资,计算税率*/
float fax(float x)
float f1;
if(x<1000)
return 0; /*小于1000,返回0*/
switch((int)(x/1000))
case 1:f1=0.05;break; /*1000~1999,返回0.05*/
case 2:f1=0.1;break; /*2000~2999,返回0.1*/
case 3:f1=0.15;break; /*3000~3999,返回0.15*/
case 4:f1=0.2;break; /*4000~4999,返回0.2*/
default:f1=0.3;break; /*5000以上,返回0.3*/
return f1;
/*计算票面张数*/
void computer()
SALARY *p;
int i=0,a[7]=,t100,t50,t20,t10,t5,t2,t1;/*设置数组和临时变量保存票面张数*/
float t; /*过渡变量,保存当前剩余工资*/
p=First; /*移动指针从头指针开始*/
while(p!=NULL) /*当p不为空时*/
t100=(int)p->sfgz/100; /*计算100元张数*/
a[0]=a[0]+t100; /*累加保存*/
t=p->sfgz-t100*100; /*剩余工资*/
t50=(int)(t/50); /*计算50元张数*/
a[1]=a[1]+t50; /*累加保存*/
t=t-t50*50; /*剩余工资*/
t20=(int)(t/20); /*计算20元张数*/
a[2]=a[2]+t20; /*累加保存*/
t=t-t20*20; /*剩余工资*/
t10=(int)(t/10); /*计算10元张数*/
a[3]=a[3]+t10; /*累加保存*/
t=t-t10*10; /*剩余工资*/
t5=(int)(t/5); /*计算5元张数*/
a[4]=a[4]+t5; /*累加保存*/
t=t-t5*5; /*剩余工资*/
t2=(int)(t/2); /*计算2元张数*/
a[5]=a[5]+t2; /*累加保存*/
t=t-t2*2; /*剩余工资*/
t1=(int)(t); /*计算1元张数*/
a[6]=a[6]+t1; /*累加保存*/
p=p->next; /*指针后移,处理下一条记录*/
clrscr(); /*清屏*/
printf("\n\n\n***********ticket number***************\n"); /*输出标题*/
printf("--100-----50------20-----10-----5------2------1------\n");
/*输出张数标题*/
for(i=0;i<7;i++)
printf("%5d ",a[i]);/*输出所需的张数*/
printf("\n");/*换行*/
/*按编号查找记录*/
SALARY *find(char *no)
SALARY *p; /*定义移动指针*/
p=First; /*从头指针开始*/
while(p) /*当p不为空时*/
if(!strcmp(no,p->no))
return p; /*比较相等,查找成功,返回指针*/
p=p->next; /*不相等指针后移*/
printf("not found\n"); /*没有找到*/
return NULL; /*返回为空指针*/
参考技术C 在第二次打开文件前先关闭。 参考技术D 尾段的
for(i=0;i<n;i++)
改为
for(i=0;i<=n;i++)
试试追问
还是不行
追答前面统计个数略改了一下 这样就能看到你存的结果了
文件以二进制保存,即数字65用记事本看是A 所以有乱码
后面是完整的程序 多条记录录入 学号转入0结束
#include
#include
#include
#ifndef MAX_NUM
#define MAX_NUM 100
#endif
typedef struct student
char num[11];
int math;
int eng;
int chin;
float ave;
int totle;
stu;
void main()
stu a[MAX_NUM];
int i = 0, n = 0, k = 0;
FILE *fp = fopen("e:\\student.txt","rb+");
clrscr();
printf("学号\t数:\t英:\t语:\t均:\t总:\t\n");
for(n = 0; fp && fread(&a[n], 1, sizeof(stu), fp) != 0; ++n)
printf("%s\t%d\t%d\t%d\t%f\t%d\t\n",
a[n].num,a[n].math,a[n].eng,a[n].chin,a[n].ave,a[n].totle);
printf("*************************************************\n");
if(fp == NULL && (fp = fopen("e:\\student.txt","wb")) == NULL)
printf("open file error!\n");
exit(0);
fseek(fp, 0, SEEK_SET);
printf("请输入要添加的信息");
do
printf("\n请输入第%d个学生信息:\n",n + 1);
printf("学号:\n");
scanf("%s",a[n].num);
if(!strcmp(a[n].num,"0"))break;
printf("math成绩:\n");
scanf("%d",&a[n].math);
printf("english成绩:\n");
scanf("%d",&a[n].eng);
printf("chin成绩:\n");
scanf("%d",&a[n].chin);
a[n].totle=a[n].math+a[n].eng+a[n].chin;
a[n].ave=a[n].totle/3;
for(k = n-1; k >= 0; k--)
if(strcmp(a[k].num,a[n].num) == 0)
printf("该学生已经存在,请重新输入");
break;
/* for(i = 0; i <= n; i++)
fwrite(&a[i], sizeof(a[i]),1 , fp);*/
fwrite(&a[n], sizeof(a[n]),1 , fp);
n++;
while(1);
fclose(fp);
如果一次不能输入多条记录 就把fseek删掉
附英文下运行结果
C语言高手进(高分悬赏)
1.酒店客房信息管理系统:
是实现对客人信息如客人编号、
身份证号、姓名、性别、房间号、入住时间、入住天数、联系电话
等实现输入、查询、修改、输出、添加等功能的系统。功能总体结构如下:
2.功能
a.输入模块(creat函数):
b.修改模块(modify函数):
以编号或身份证号等中的一个查找单个客人的信息后进行修改
c.查找模块(search函数):
以编号或身份证号等中的一个查找单个客人的信息
d.输出模块(output函数):
显示所有客人的所有信息
e.显示模块(show函数):
该模块实现制作人员相关信息的显示。
f.追加模块(add函数):
该模块可以添加新的客人信息,并且不影响以前输入的信息。
g.退出运行界面(quit):
退出整个函数运行界面,回到原程序。
3.每次实现完一个功能后都可以自动返回功能选择页面
有类似的程序也行,谢谢了。偶舍得分!
在线等,急!!!!!!!!!!!!!!!!!!!!
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct student
char num[10];
char name[20];
char id[19];
float total;
float yuwen;
float shuxue;
float yingyu;
float ziran;
float zhengzhi;
;
typedef struct node
struct student data;
struct node *next;
Node,*Link;
int shoudsave;
int find;
int count=0;
void menu()
printf("*******************************************************************************\n");
printf("\t1添加学生信息\t\t\t\t\t2查询学生信息\n");
printf("\t3修改学生信息\t\t\t\t\t4保存学生信息\n");
printf("\t0退出系统\n");
printf("*****************************************************************************\n");
void printstart()
printf("---------------------------------------------\n");
void Wrong()
printf("\n=====>提示:输入有错误!\n");
void Nofind()
printf("\n=====>提示:没有找到该学生!\n");
void printc()
printf("学号\t 姓名 id 总分 语文 数学 英语 自然 政治\n");
void printe(Node *p)
printf("%-12s%s\t%s\t%5.1f %5.1f %5.1f %5.1f %5.1f %5.1f \n",p->data.num,p->data.name,p->data.id,p->data.total,p->data.yuwen,p->data.shuxue,p->data.yingyu,p->data.ziran,p->data.zhengzhi);
Node* Locate(Link abc,float low,float high ,char findmess[],char nameornum[])
Node *r;
if(strcmp(nameornum,"total")==0)
r=abc->next;
while(r!=NULL)
if(r->data.total >= low&& r->data.total <= high)
printf("\t\t\t\t查找结果 %5.1f分~%5.1f分\n",low,high);
printstart();
printc();
printe(r);
printstart();
find = 1;
return Locate(r,low,high,"null","total");
r=r->next;
else if(strcmp(nameornum,"name")==0)
r=abc->next;
while(r!=NULL)
if(strcmp(r->data.name,findmess)==0)
return r;
r=r->next;
else if(strcmp(nameornum,"num")==0)
r=abc->next;
while(r!=NULL)
if(strcmp(r->data.num,findmess)==0)
return r;
r=r->next;
return 0;
void Add(Link abc)
Node *p,*r,*s;
char num[10];
r=abc->next;
s=abc->next;
while(1)
printf("输入学号(以'0'返回上一级菜单:)");
scanf("%s",num);
if(strcmp(num,"0")==0)
break;
p=(Node *)malloc(sizeof(Node));
strcpy(p->data.num,num);
printf("请你输入姓名:");
scanf("%s",p->data.name);
getchar();
printf("请你输入id:");
scanf("%s",&p->data.id);
getchar();
printf("请你输入语文:");
scanf("%f",&p->data.yuwen);
printf("请你输入数学:");
scanf("%f",&p->data.shuxue);
printf("请你输入英语:");
scanf("%f",&p->data.yingyu);
printf("请你输入自然:");
scanf("%f",&p->data.ziran);
printf("请你输入政治:");
scanf("%f",&p->data.zhengzhi);
p->data.total = p->data.yuwen + p->data.shuxue + p->data.yingyu + p->data.ziran + p->data.zhengzhi;
printf("total:%5.1f\n", p->data.total);
if(count!=0)
if(p->data.total>abc->next->data.total)
p->next = abc->next;
abc->next = p;
else
for(;r->data.total<p->data.total;r = r->next);
if(r->data.total>p->data.total)
p->next = r->next;
r->next = p;
else
abc->next = p;
p->next = r;
else
r = p;
p->next = NULL;
abc->next=r;
count ++;
shoudsave=1;
void Qur(Link abc)
int sel;
char findmess[20];
float low,high;
Node *p;
if(!abc->next)
printf("\n======>1提示:没有资料可以查询!\n");
return;
printf("\n=====>1按成绩区间查找\n=====>2按姓名查找\n");
scanf("%d",&sel);
if(sel==1)
printf("请输入要分数区间(用空格隔开)至少要大于420:");
scanf("%f%f",&low,&high);
if(low<420)
low=420;
find = 0;
Locate(abc,low,high,"null","total");
if(!find)Nofind();
else if(sel==2)
printf("请输入要查找的姓名:");
scanf("%s",findmess);
p=Locate(abc,0,750,findmess,"name");
if(p)
printf("\t\t\t\t查找结果\n");
printstart();
printc();
printe(p);
printstart();
else
Nofind();
else
Wrong();
void Modify(Link abc)
Node *p;
char findmess[20];
if(!abc->next)
printf("\n=====>提示:没有资料可以修改!\n");
return;
printf("请你输入要修改的学生学号:");
scanf("%s",findmess);
p=Locate(abc,0,0,findmess,"num");
if(p)
printf("请你输入新学号(原来是%s):",p->data.num);
scanf("%s",p->data.num);
printf("请你输入新姓名(原来是%s):",p->data.name);
scanf("%s",p->data.name);
getchar();
printf("请你输入新id(原来是%S):",p->data.id);
scanf("%s",p->data.id);
getchar();
printf("\n=====>提示:资料修改成功!\n");
shoudsave=1;
else
Nofind();
void Disp(Link abc)
int count=0;
Node *p;
p=abc->next;
if(!p)
printf("\n=====>提示:没有资料可以显示!\n");
return;
printf("\t\t\t\t显示结果\n");
printstart();
printc();
printf("\n");
void Save(Link abc)
FILE* fp;
Node *p;
int flag=1,count=0;
fp=fopen("c:\\student","wb");
if(fp==NULL)
printf("\n=====>提示:重新打开文件时发生错误!\n");
exit(1);
p=abc->next;
while(p)
if(fwrite(p,sizeof(Node),1,fp)==1)
p=p->next;
count++;
else
flag=0;
break;
if(flag)
printf("\n=====>提示:文件保存成功.(有%d条记录已经保存.)\n",count);
shoudsave=0;
fclose(fp);
void main()
Link abc;
FILE *fp;
int sel;
char ch;
char jian;
Node *p,*r;
printf("\t\t\t\t学生成绩管理系统\n\t\t\t\t\n");
abc=(Node*)malloc(sizeof(Node));
abc->next=NULL;
r=abc;
fp=fopen("C:\\student","rb");
if(fp==NULL)
printf("\n====>提示:文件不存在,是否创建?(Y/N)\n");
scanf("%c",&jian);
fp = fopen("c:\\student","w");
count = 0;
else
printf("\n====>提示:文件已经打开,正在导入记录......\n");
while(!feof(fp))
p=(Node*)malloc(sizeof(Node));
if(fread(p,sizeof(Node),1,fp))
p->next=NULL;
r->next=p;
r=p;
count++;
fclose(fp);
printf("\n====>提示:记录导入完毕,共导入%d条记录.\n",count);
while(1)
menu();
printf("请你选择操作:");
sel = getch();//("%d",&sel);
putch(sel);
putch('\n');
if(sel=='0')
if(shoudsave==1)
getchar();
printf("\n====>提示:资料已经改动,是否将改动保存到文件中(Y/N)?\n");
scanf("%c",&ch);
if(ch=='y')Save(abc);
printf("\n====>提示:你已经推出系统!\n");
break;
switch(sel)
case '1':Add(abc);break;
// case 2:Del(abc);break;
case '2':Qur(abc);break;
case '3':Modify(abc);break;
case '4':Save(abc);break;
default:Wrong();getchar();break;
参考技术A 200分可能有人帮你弄的
/*编制一个学生成绩管理系统,每个学生信息包括:学号、姓名、C语言、高数和英语成绩。具体功能:
(1)创建信息链表并以磁盘文件保存;
(2)读取磁盘文件并显示输出所有学生的成绩;
(3)按学号或姓名查询成绩;
(4)添加成绩记录;
(5)修改指定姓名或学号的学生的成绩并可存盘;
(6)显示输出60分以下、60~79、80~89、90分以上各分数段的学生信息。以C语言成绩为例*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define N 20
typedef struct
char name[10];
int num;
float c;
float math;
float english;
float aver;
stu;
//菜单
void menu() /*便于操作员使用*/
/*清屏*/
system("cls");
printf(" 学生平时成绩管理\n");
printf("=======================\n");
printf(" 1.成绩录入\n");
printf(" 2.计算\n");
printf(" 3.查询\n");
printf(" 4.修改\n");
printf(" 5.插入\n");
printf(" 6.显示\n");
printf(" 7.统计\n");
printf(" 8.删除\n");
printf(" 0.退出\n");
printf("=======================\n");
printf("请选择相应的功能:");
//成绩录入
void input()
FILE *fp;
stu xs; /*定义一个结构体变量来装从文件中读出来的数据*/
if((fp=fopen("student.dat","ab"))==NULL) printf("can't open file!\n");exit(0);
printf("\n录入格式: 姓名 学号 C语言 高数 英语 当输入姓名为ps结束录入\n");
while(1) /*中间加油break,可使循环中断*/
scanf("%s",xs.name);
if(strcmp(xs.name,"ps")==0) break;/*判断姓名是否为ps,用字符串判断*/
scanf("%d%f%f%f",&xs.num,&xs.c,&xs.math,&xs.english);
xs.aver=0;/*给平均分变量赋初值*/
fwrite(&xs,sizeof(stu),1,fp); //将成绩信息写入文件
fclose(fp);
//计算平均分
void sum()
int i=0,n;
stu xs[N];
FILE *fp;
if((fp=fopen("student.dat","rb+"))==NULL) printf("can't open file!\n");exit(0);
while(!feof(fp))/*文件读入内存,读取指针未到文件尾时返回值为0,读到尾时返回值为1,加!取反后,结束即为0*/
fread(&xs[i],sizeof(stu),1,fp);/*读入结构体变量*/
if(feof(fp)) break;/*上面while循环那个会多读一次因为读到尾时那个0还没返回,这里判断如果以读到文件尾,则直接停止,避免重复输入*/
xs[i].aver=(xs[i].c+xs[i].math+xs[i].english)/3;
i++;
n=i;/*把i的末尾值给n,用于下面循环写入*/
i=0;
fclose(fp);
if((fp=fopen("student.dat","wb"))==NULL) printf("can't open file!\n");exit(0);
while(i<n)
fwrite(&xs[i],sizeof(stu),1,fp);
i++;
fclose(fp);
void xingming()
FILE *fp;
stu xs;
char name[10];
printf("\n输入要查学生的姓名: ");scanf("%s",name);
if((fp=fopen("student.dat","rb"))==NULL) printf("can't open file!\n");exit(0);
while(!feof(fp))
fread(&xs,sizeof(stu),1,fp);
if(strcmp(xs.name,name)==0)/*按姓名查询时判断输入的姓名是否存在,会循环从数据中找取*/
printf(" 学生的信息如下:\n");
printf("\n%10s %6s %6s %6s %6s %6s\n","姓名","学号","C语言","高数"," 英语","平均成绩");
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver);
break;
if(feof(fp)) printf("查找失败!!!"); /*学生不存在*/
fclose(fp);
void xuehao()
FILE *fp;
stu xs;
int num;
printf("\n输入要查学生的学号: ");scanf("%d",&num);
if((fp=fopen("student.dat","rb"))==NULL) printf("can't open file!\n");exit(0);
while(!feof(fp))
fread(&xs,sizeof(stu),1,fp);
if(xs.num==num)/*按学号查询时判断输入的学号是否存在,会循环从数据中找取*/
printf(" 学生的信息如下:\n");
printf("\n%10s %6s %6s %6s %6s %6s\n","姓名","学号","C语言","高数"," 英语","平均成绩");
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver);
break;
if(feof(fp)) printf("查找失败!!!");
fclose(fp);
//查询
void search()
char ch1;
system("cls");
printf("请输入按何种方式查询:\n");
printf("1-姓名,2-学号:");
ch1=getchar();/*用字符接收*/
switch(ch1)/*判断*/
case '1':xingming();break;
case '2':xuehao();break;
getch();/*让屏幕停留同时按任意键返回*/
//修改:输入学生的姓名,查找该学生,若找到则修改该生的成绩信息,并显示修改前后的结果;
void modi()
stu xs;
FILE *fp;
char name[10];
system("cls");
printf("\n输入要查学生的姓名: ");scanf("%s",name);
if((fp=fopen("student.dat","rb+"))==NULL) printf("can't open file!\n");exit(0);
while(!feof(fp))
fread(&xs,sizeof(stu),1,fp);
if(strcmp(xs.name,name)==0)/*判断输入要修改的姓名是否存在*/
printf(" 修改前学生的信息如下:\n");
printf("\n%10s %6s %6s %6s %6s %6s\n","姓名","学号","C语言","高数"," 英语","平均成绩");
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver);
printf("\n请输入该生的C语言成绩:");scanf("%f",&xs.c);
printf("\n高数成绩:");scanf("%f",&xs.math);
printf("\n英语成绩:");scanf("%f",&xs.english);
xs.aver=(xs.c+xs.math+xs.english)/3;
break;
if(!feof(fp))
printf(" \n 修改后的学生的信息如下:\n");
printf("\n%10s %6s %6s %6s %6s %6s\n","姓名","学号","C语言","高数"," 英语","平均成绩");
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver);
fseek(fp,sizeof(stu),1);/*负号表示后退,1表示文件当前位置*/
fwrite(&xs,sizeof(stu),1,fp);/*再写入,同时把要修改的那个覆盖掉*/
else
printf("\n学生不存在,修改失败!!");
fclose(fp);
getch();
//插入:输入学生的平时的各项成绩,插入到指定位置;当指定的位置超出范围时,将其插入到全班的最后,并显示插入成功后的结果。
void insert()
int i=0,j,k,lenth;
FILE *fp;
stu s,xs[N];
system("cls");
printf("\n请输入插入的学生的姓名:");scanf("%s",&s.name);
printf("\n学生的学号:");scanf("%d",&s.num);
printf("\n学生的C成绩:");scanf("%f",&s.c);
printf("\n高数成绩:");scanf("%f",&s.math);
printf("\n英语成绩:");scanf("%f",&s.english);
s.aver=(s.c+s.math+s.english)/3;
printf("\n插入位置:");scanf("%d",&k);
// i=0;
if((fp=fopen("student.dat","rb"))==NULL) printf("can't open file!\n");exit(0);
while(!feof(fp))
fread(&xs[i],sizeof(stu),1,fp);/*把数据读入到结构体数组中*/
if(feof(fp)) break;
i++;
fclose(fp);
lenth=i;
if(k<lenth && k>=0)/*k的位置要位于数组范围之内*/
//插入
for(j=lenth-1;j>=k;j--)
xs[j+1]=xs[j];/*一开始j是最大的,往后移一个这样移动避免数据被覆盖*/
/*循环是只循环这一句的*/
xs[k]=s;/*将输入的学生信息加入这个k位置*/
lenth++;/*长度+1*/
//写回
if((fp=fopen("student.dat","wb"))==NULL) printf("不能建立文件!!\n");exit(0);
for(i=0;i<lenth;i++)
fwrite(&xs[i],sizeof(stu),1,fp);
else/*不再数组范围之内*/
if((fp=fopen("student.dat","ab"))==NULL) printf("不能建立文件!!\n");exit(0);
fwrite(&s,sizeof(stu),1,fp);
fclose(fp);
//显示
void print()
FILE *fp;
stu s;
system("cls");
if((fp=fopen("student.dat","rb"))==NULL) printf("can't open file!\n");exit(0);
printf("\n%10s %s %6s %6s %6s %6s\n","姓名","学号","C语言","高数"," 英语","平均成绩");
while(!feof(fp))
fread(&s,sizeof(stu),1,fp);//从文件中读取成绩信息
if(feof(fp)) break;//判断是否文件尾
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",s.name,s.num,s.c,s.math,s.english,s.aver);
fclose(fp);
getch();
//统计
void tongji()
int i=0,j=0,k=0,l=0,m=0,n,p,q,r,t,u;
FILE *fp;
stu s[N], *p1[N],*p2[N],*p3[N],*p4[N];/*用指针数组*/
system("cls");
if((fp=fopen("student.dat","rb"))==NULL) printf("cant't open file!\n");exit(0);
while(!feof(fp))
fread(&s[i++],sizeof(stu),1,fp);/*读入数据*/
if(feof(fp)) break;
t=i;i=0;
for(u=0;u<t;u++)/*以下每个指针数组用于指向各分数段的学生信息*/
if(s[i].c<60) p1[j++]=&s[i++];continue;/*每个学生信息只能位于一个分数段*/
if(s[i].c>=60&&s[i].c<80) p2[k++]=&s[i++];continue;
if(s[i].c>=80&&s[i].c<90) p3[l++]=&s[i++];continue;
if(s[i].c>=90) p4[m++]=&s[i++];continue;
printf("不及格:姓名 学号 C语言\n");
for(n=0;n<j-1;n++)
printf("%10s %6d %6.2f\n",p1[n]->name,p1[n]->num,p1[n]->c);
printf("60-79:姓名 学号 C语言\n");
for(p=0;p<k;p++)
printf("%10s %6d %6.2f\n",p2[p]->name,p2[p]->num,p2[p]->c);
printf("80-89:姓名 学号 C语言\n");
for(q=0;q<l;q++)
printf("%10s %6d %6.2f\n",p3[q]->name,p3[q]->num,p3[q]->c);
printf("90以上:姓名 学号 C语言\n");
for(r=0;r<m;r++)
printf("%10s %6d %6.2f\n",p4[r]->name,p4[r]->num,p4[r]->c);
fclose(fp);
getch();
//删除:输入学生姓名,若该学生存在,则删除,并显示删除后余下的学生成绩信息
void dele()
stu xs[N];
FILE *fp;
char name[10];
int i=0,len,k=-1/*k<0是为后面if判断用的*/;
system("cls");
printf("\n输入要删除的学生姓名: ");scanf("%s",name);
if((fp=fopen("student.dat","rb+"))==NULL) printf("can't open file!\n");exit(0);
while(!feof(fp))
fread(&xs[i],sizeof(stu),1,fp);
if(feof(fp)) break;
if(strcmp(xs[i].name,name)==0) k=i;
i++;
fclose(fp);
//以下是删除后重新写文件
len=i;/*结构体数组上限*/
if(k>=0)/*k>0说明找到删除学生位置*/
if((fp=fopen("student.dat","wb+"))==NULL) printf("can't open file!\n");exit(0);
for(i=0;i<len;i++)
if(i==k) continue;/*从这个位置开始写入*/
fwrite(&xs[i],sizeof(stu),1,fp);
fclose(fp);
else printf("删除失败!!!\n");getch(); /*失败后重新返回菜单*/
print();
//菜单选择
void main()
char ch;
while(1)
menu();// 显示菜单
ch=getch();//选择菜单
if(ch=='0') break;
switch(ch)//判断功能项
case '1':input();break;
case '2':sum();break;
case '3':search();break;
case '4':modi();break;
case '5':insert();break;
case '6':print( );break;
case '7':tongji();break;
case '8':dele();break;
printf("\n欢迎使用!!!\n");
//类似的吧
以上是关于C语言编程文本保存问题。。高分悬赏的主要内容,如果未能解决你的问题,请参考以下文章
急!高分悬赏!求c语言高手!!!二叉树输入中如何判断输入是不是合法?
高分悬赏java web编程中动态项目的eclipse+tomcat+sql2000的配置问题,成功以后还要加分。
F(0)=0 F(1)=1 F(2)=2 F(N)=F(N-1)+F(N-2)+F(N-3) N>3 语言用c或者c++,采用栈来实现这个函数。高分悬赏~~