职工工资文件

一.前言

C语言谭书中文件一章,不错的题目。

二.题目

9.有一磁盘文件employee,内存放职工的数据。每个职工的数据包括职工姓名、职工号、性别、年龄、住址、工资、健康状况、文化程度。今要求将职工名、工资的信息单独抽出来另建一个简明的职工工资文件。

由于一开始没有employee文件,需要自己创建一下:

#include<stdio.h>
#include<stdlib.h>
typedef struct{
	char name[20];//职工姓名
	int num;//职工号
	char gender[10];//性别
	int age;
	char address[30];//住址 
	int wage;
	char h_condition[10];//健康状况 
	char edu_degree[10];//文化程度 
}Staff;
	
int main(){//创造一个employee文件 
	Staff staffs[4];
	FILE*fp;
	int i;
	int count=0;
	Staff*p=staffs;
	
	if((fp=fopen("C:\\Users\\17604\\Desktop\\employee.dat","wb"))==NULL){
		printf("打开文件失败!!");
		exit(0); 
	}
	//从键盘输入职工数据 
	for(p=staffs;p<staffs+4;p++){
		count++;
		printf("请输入第%d个职工的职工号,姓名,性别,年龄,住址,工资,健康状况,文化程度:\n",count);
		scanf("%d%s%s%d%s%d%s%s",&p->num,p->name,p->gender,&p->age,p->address,
				&p->wage,p->h_condition,p->edu_degree);
	} 
//	fclose(fp);
	
	//打印职工数据
	printf("职工号  姓名  性别  年龄  住址    工资	  健康状况  文化程度:\n");
	 for(p=staffs;p<staffs+4;p++){
		printf("%-4d%8s%4s%6d%10s%6d%10s%10s\n",p->num,p->name,p->gender,p->age,p->address,
				p->wage,p->h_condition,p->edu_degree);
	} 
	//写入 
	p=staffs;
	for(i=0;i<4;i++){
		if(fwrite(p,sizeof(Staff),1,fp)!=1){
			printf("写入文件失败!!\n");
		}
		p++; 
	}
	fclose(fp);
	return 0;
}

程序执行效果图:(在我的计算机中C:\Users\17604\Desktop\employee.dat,文件就生成了)
在这里插入图片描述

可以开始干题目了!!!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
	char name[20];//职工姓名
	int num;//职工号
	char gender[10];//性别
	int age;
	char address[30];//住址 
	int wage;
	char h_condition[10];//健康状况 
	char edu_degree[10];//文化程度 
}Staff;

typedef struct{
	char name[20];//职工姓名
	int wage;
} StaffWage; 

int main(){
	Staff staffs[4];
	StaffWage staffwages[4];
	StaffWage*pt=staffwages;
	FILE*fp;
	int i;
	Staff*p=staffs;
	
	if((fp=fopen("C:\\Users\\17604\\Desktop\\employee.dat","rb"))==NULL){
		printf("打开文件失败!!");
		exit(0); 
	}
	
	//读入 
	p=staffs;
	for(i=0;i<4;i++){
		if(fread(p,sizeof(Staff),1,fp)!=1){
			printf("读入文件失败!!\n");
		}
		p++; 
	}
	fclose(fp);
	
		//打印职工数据同时给职工工资表赋值 
	printf("职工号  姓名  性别  年龄  住址    工资	  健康状况  文化程度:\n");
	 for(p=staffs;p<staffs+4;p++){
		printf("%-4d%8s%4s%6d%10s%6d%10s%10s\n",p->num,p->name,p->gender,p->age,p->address,
				p->wage,p->h_condition,p->edu_degree);
		strcpy(pt->name,p->name);
		pt->wage=p->wage;
		pt++; 
	} 
	//将职工工资表写入文件 
	if((fp=fopen("C:\\Users\\17604\\Desktop\\employeeWage.dat","wb"))==NULL){
		printf("打开文件失败!!");
		exit(0); 
	}
	pt=staffwages;
	for(i=0;i<4;i++){
		if(fwrite(pt,sizeof(StaffWage),1,fp)!=1){
			printf("写入文件失败!!\n");
		}
		pt++; 
	}
	fclose(fp);
	return 0;
}

效果图:
在这里插入图片描述

验证,由于是二进制文件,用记事本无法查看,所以写一个程序查看一下是否正确(是否为题目所求)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
	char name[20];//职工姓名
	int num;//职工号
	char gender[10];//性别
	int age;
	char address[30];//住址 
	int wage;
	char h_condition[10];//健康状况 
	char edu_degree[10];//文化程度 
}Staff;

typedef struct{
	char name[20];//职工姓名
	int wage;
} StaffWage; 

int main(){
	Staff staffs[4];
	StaffWage staffwages[4];
	StaffWage*pt=staffwages;
	FILE*fp;
	int i;
	Staff*p=staffs;
	
	if((fp=fopen("C:\\Users\\17604\\Desktop\\employee.dat","rb"))==NULL){
		printf("打开文件失败!!");
		exit(0); 
	}
	
	//读入 
	p=staffs;
	for(i=0;i<4;i++){
		if(fread(p,sizeof(Staff),1,fp)!=1){
			printf("读入文件失败!!\n");
		}
		p++; 
	}
	fclose(fp);
	
		//打印职工数据同时给职工工资表赋值 
	printf("职工号  姓名  性别  年龄  住址    工资	  健康状况  文化程度:\n");
	 for(p=staffs;p<staffs+4;p++){
		printf("%-4d%8s%4s%6d%10s%6d%10s%10s\n",p->num,p->name,p->gender,p->age,p->address,
				p->wage,p->h_condition,p->edu_degree);
		strcpy(pt->name,p->name);
		pt->wage=p->wage;
		pt++; 
	} 
	//将职工工资表写入文件 
	if((fp=fopen("C:\\Users\\17604\\Desktop\\employeeWage.dat","wb"))==NULL){
		printf("打开文件失败!!");
		exit(0); 
	}
	pt=staffwages;
	for(i=0;i<4;i++){
		if(fwrite(pt,sizeof(StaffWage),1,fp)!=1){
			printf("写入文件失败!!\n");
		}
		pt++; 
	}
	fclose(fp);
	return 0;
}

效果图:
在这里插入图片描述
附加题:
10.从第9题的“职工工资文件”中删去一个职工的数据,再存回原文件。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
	char name[20];//职工姓名
	int wage;
} StaffWage;

int main(){
	FILE*fp;
	int i;
	StaffWage staffwages[4];
	StaffWage*pt=staffwages;
	char temp[20];//存放要删除的职工名
	int position;//记录位置 
	if((fp=fopen("C:\\Users\\17604\\Desktop\\employeeWage.dat","rb"))==NULL){
		printf("打开文件失败!!");
		exit(0); 
	}
	pt=staffwages;
	for(i=0;i<4;i++){
		if(fread(pt,sizeof(StaffWage),1,fp)!=1){
			printf("读入文件失败!!\n");
		}
		pt++; 
	}
	fclose(fp);
	//打印数据
	printf("原始数据:\n"); 
	printf("姓名  工资:\n"); 
	for(pt=staffwages;pt<staffwages+4;pt++){
		printf("%-6s%-4d\n",pt->name,pt->wage);
	}
	
	printf("请输入你要删除的职工的职工名:\n");
	scanf("%s",temp);
	
	pt=staffwages; 
	for(i=0;i<4;i++){
		if(strcmp((pt+i)->name,temp)==0){
			break;//找了要删除的职工 
		}
	}
	position=i;
	//删除
	for(i=position;i<3;i++){
		staffwages[i]=staffwages[i+1];
	} 
	
	//打印数据
	printf("删除后数据:\n"); 
	printf("姓名  工资:\n"); 
	for(pt=staffwages;pt<staffwages+3;pt++){
		printf("%-6s%-4d\n",pt->name,pt->wage);
	}
	
	if((fp=fopen("C:\\Users\\17604\\Desktop\\employeeWage.dat","wb"))==NULL){
		printf("打开文件失败!!");
		exit(0); 
	}
	pt=staffwages;
	for(i=0;i<4;i++){
		if(fwrite(pt+i,sizeof(StaffWage),1,fp)!=1){
			printf("写入文件失败!!\n");
		}
	}
	fclose(fp);
	return 0;
}

效果图:
在这里插入图片描述

再使用上述程序查看文件效果图:
在这里插入图片描述

后记:
由于今天时间有点匆忙,任务有点多,撸码,没有考虑很多细节。只是为完成和实现。代码写的有点死。很多代码块可以写成函数模块。
呃呃。。对就是这样。头疼…撸码撸的有点多。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无言月梧桐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值