#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void menu();
void input();
void find();
int find_way(struct stu *pi,int a);
void exchange();
void del_go(int num);
void del();
void move();
void show_all();
FILE *fp;
struct stu
{
int num;
char name[10];
char sex[4];
char unit[10];
char address[15];
char phone[11];
float salary;
float allowance;
float life;
float telBill;
float waterBill;
float rent;
float income_tax;
float cleanBill;
float fund;
float total_deduct;
float realPay;
float shouldPay;
int number;
}*pi;
int main()
{ struct stu a;
pi=&a;
if ((fp = fopen("www.duan", "ab+")) == NULL)
printf("打开文件出错!!!"), exit(0);
menu();
return 0;
}
void menu() {
int num;
system("cls");
printf("\t\t\t|----------------------------------------|\n");
printf("\t\t\t| 欢迎使用教师工资管理系统 |\n");
printf("\t\t\t| 菜单列表 |\n");
printf("\t\t\t| [1]添加教师信息 |\n");
printf("\t\t\t| [2]修改教师信息 |\n");
printf("\t\t\t| [3]删除教师信息 |\n");
printf("\t\t\t| [4]查询教师信息 |\n");
printf("\t\t\t| [5]查询所有教师信息 |\n");
printf("\t\t\t| [0]退出程序 |\n");
printf("\t\t\t| 请选择你要进行的项目: |\n");
printf("\t\t\t|----------------------------------------|\n");
scanf("%d",&num);
switch (num)
{
case 1:input();break;
case 2:exchange();break;
case 3:del();break;
case 4:find();break;
case 5:show_all();break;
case 0:exit(0);break;
default:printf("没有符合您选择的功能,请重新输入!");
}
}
void show_all()
{FILE *fp = fopen("www.duan", "rb");
int c;
int i ;
while((c=fgetc(fp))!=EOF)
{
printf("教师号%d\n姓名%s\n性别%s\n单位名称%s\n家庭住址%s\n联系电话%s\n基本工资%.2f\n津贴%.2f\n生活补贴%.2f\n电话费%.2f\n水电费%.2f\n房租%.2f\n所得税%.2f\n卫生费%.2f\n公积金%.2f\n应发工资%.2f\n合计扣款%.2f\n实发工资%.2f\n",pi->num, pi->name, pi->sex, pi->unit, pi->address,pi->phone,pi->salary,pi->allowance,pi->life,pi->telBill,pi->waterBill,pi->rent,pi->income_tax,pi->cleanBill,pi->fund,pi->shouldPay,pi->total_deduct,pi->realPay);
}
menu();
}
为什么最后输出所有信息输不出来呢(中间已省略)
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
5条回答 默认 最新
- 技术专家团-小桥流水 2022-01-06 16:44关注
show_all函数中,读文件跟你的pi有什么关系啊?
pi是全局变量,你是不是在读取文件的时候已经把这个指针移动到最后了?
而且你的while循环中,pi也没有移动,输出的永远是一个位置的元素。
正确的逻辑应该是:
(1)在main函数中先读取文件,然后把所有数据保存起来,pi记录结构体数组的首地址。
(2)在show_all函数中,遍历pi指向的结构体数组就可以了(需要用一个临时变量p=pi,然后用p++遍历所有元素,因为pi是全局变量,所以不要直接用pi遍历,否则pi的值就改变了)
代码修改如下:#include<stdio.h> #include<stdlib.h> #include<string.h> void menu(); void input(); void find(); int find_way(struct stu *pi,int a); void exchange(); void del_go(int num); void del(); void move(); void show_all(); void readfile(); //读取文件 FILE *fp; struct stu { int num; char name[10]; char sex[4]; char unit[10]; char address[15]; char phone[11]; float salary; float allowance; float life; float telBill; float waterBill; float rent; float income_tax; float cleanBill; float fund; float total_deduct; float realPay; float shouldPay; int number; }*pi; int g_nmb=0; //记录实际个数 int main() { readfile(); //读取文件 menu(); return 0; } void menu() { int num; system("cls"); printf("\t\t\t|----------------------------------------|\n"); printf("\t\t\t| 欢迎使用教师工资管理系统 |\n"); printf("\t\t\t| 菜单列表 |\n"); printf("\t\t\t| [1]添加教师信息 |\n"); printf("\t\t\t| [2]修改教师信息 |\n"); printf("\t\t\t| [3]删除教师信息 |\n"); printf("\t\t\t| [4]查询教师信息 |\n"); printf("\t\t\t| [5]查询所有教师信息 |\n"); printf("\t\t\t| [0]退出程序 |\n"); printf("\t\t\t| 请选择你要进行的项目: |\n"); printf("\t\t\t|----------------------------------------|\n"); scanf("%d",&num); switch (num) { case 1:input();break; case 2:exchange();break; case 3:del();break; case 4:find();break; case 5:show_all();break; case 0:exit(0);break; default:printf("没有符合您选择的功能,请重新输入!"); } } void show_all() { struct stu* p = pi; int i= 0; while(i<g_nmb) { printf("教师号%d\n姓名%s\n性别%s\n单位名称%s\n家庭住址%s\n联系电话%s\n基本工资%.2f\n津贴%.2f\n生活补贴%.2f\n电话费%.2f\n水电费%.2f\n房租%.2f\n所得税%.2f\n卫生费%.2f\n公积金%.2f\n应发工资%.2f\n合计扣款%.2f\n实发工资%.2f\n",p->num, p->name, p->sex, p->unit, p->address,p->phone,p->salary,p->allowance,p->life,p->telBill,p->waterBill,p->rent,p->income_tax,p->cleanBill,p->fund,p->shouldPay,p->total_deduct,p->realPay); p++; i++; } menu(); } void readfile() { FILE *fp = fopen("www.duan", "r"); int i=0 ; struct stu *p; pi = 0; g_nmb = 0; //假设一行中有一个结构体数据,字段之间用空格分割 while(!feof(fp)) { p = (struct stu *)malloc(sizeof(struct stu)); if(pi==0) pi = p; fscanf(fp,"%d %s %s %s %s %s %f %f %.2f %f %f %f %f %f %f %f %f %f",&p->num, p->name, p->sex, p->unit, p->address,p->phone,&p->salary,&p->allowance,&p->life,&p->telBill,&p->waterBill,&p->rent,&p->income_tax,&p->cleanBill,&p->fund,&p->shouldPay,&p->total_deduct,&p->realPay); g_nmb++; } fclose(fp); }
解决 1无用
悬赏问题
- ¥15 请问Quartus的Verilog代码怎么写?
- ¥18 光催化第一性原理计算析氢效率STH怎么计算
- ¥100 Mac 版foxmail 收邮件问题
- ¥15 QWebEngineView
- ¥15 如何使用shufflenet进行手写数字识别
- ¥15 .net core 同时编辑怎么防止数据串了
- ¥20 微信小程序播放直播流
- ¥15 关于迷宫自走单片机循迹小车的知识
- ¥15 python使用selenium工具爬取网站的问题
- ¥15 visual studio中c语言用ODBC链接SQL SERVER