#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();
}
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);
}
如果没输出来,那就是说文件是空的呗
打印的是结构体的数据,不是文件数据啊
fgetc改用fread
fread(pi,1,strlen(stu)+1,fp);
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
FILE *fp = fopen("www.duan", "rb");
char c ;
while(c!=EOF)
{
c = fgetc (fp);
printf("%c",c);
}
//测试了是可以打印文件全部内容的
return 0;
}