#ifndef _EMSTRUCT_H_ #define _EMSTRUCT_H_ struct clerk { char num[20]; //工号 char name[20]; //姓名 int iYear; //发放年份 int iMonth; //发放月份 float Post_salary;//岗位工资 float Class_salary; //课时工资 float performance_salary;//绩效工资 double total;//合计 }; #endif
这个是头文件
下面是录入数据:
#include "stdio.h" #include "EMstruct.h" #include "stdlib.h" #include "string.h" #define LEN 1024 //宏定义 /************************************/ void menu() ; void studychoose(); /***********************************/ //全局声明 /************************************/ int input_n;//需要录入的职工人数 struct clerk stu[LEN]; /************************************/ /*录入数据*/ struct clerk* screate() { int cout_cr;//循环计次用 printf("需要录入的职工人数:"); scanf("%d",&input_n); for(cout_cr=0;cout_cr<input_n;cout_cr++) { printf("员工工号:"); scanf("%s",stu[cout_cr].num); printf("员工姓名:"); scanf("%s",stu[cout_cr].name); printf("发放年份:"); scanf("%d",&stu[cout_cr].iYear); printf("发放月份:"); scanf("%d",&stu[cout_cr].iMonth); printf("岗位工资:"); scanf("%f",&stu[cout_cr].Post_salary); printf("课时工资:"); scanf("%f",&stu[cout_cr].Class_salary); printf("绩效工资:"); scanf("%f",&stu[cout_cr].performance_salary); printf("==========================================\n"); printf("\n"); } system("pause"); return stu; }
下面是打印函数:
/*显示信息*/ void stushow() { int show_count; printf("工号\t 姓名\t 发放年份\t 发放月份\t 岗位工资\t 课时工资\t 绩效工资\n"); for(show_count=0;show_count<input_n;show_count++) { printf("%s\t %s\t %d\t %d\t %.3f\t %.3f\t %.3f\n", stu[show_count].num, stu[show_count].name, stu[show_count].iYear, stu[show_count].iMonth, stu[show_count].Post_salary, stu[show_count].Class_salary, stu[show_count].performance_salary ); } if(show_count==input_n) { printf("没有信息\n"); } printf("按任意键继续....\n"); system("pause"); system("cls"); menu(); }
下面是保存数据:
/*保存信息*/ void study_save(int ix) { int save_count; FILE* save_FILE; save_FILE=fopen("save_data.dat","wb"); if(save_FILE==NULL) { printf("打开文件失败!\n"); exit(1); } for(save_count=0;save_count<ix;save_count++) if((fwrite(&stu,sizeof(stu),1,save_FILE))!=1) { printf("保存失败!\n"); exit(1); } fclose(save_FILE); printf("保存成功!\n"); printf("按任意键继续.....\n"); system("pause"); system("cls"); menu();//这个是界面函数 }
下面是加载文件数据:
void study_read(int ij) { struct clerk read_stu; int i=0; //int read_count; FILE* read_FILE; read_FILE=fopen("save_data.dat","rb"); if(read_FILE==NULL) { printf("打开文件失败!\n"); exit(1); } for(i=0;i<ij;i++) { if(fread(&stu[i],sizeof(stu),1,read_FILE)!=1) { printf("读取失败!\n"); exit(1); } } fclose(read_FILE); printf("读取到的数据是:\n"); //下面的循环是测试读取出来的数据能否正常打印 for(int k=0;k<i;k++) { printf("%s %s %d %d %.3f %.3f %.3f\n", stu[k].num, stu[k].name, stu[k].iYear, stu[k].iMonth, stu[k].Post_salary, stu[k].Class_salary, stu[k].performance_salary ); } printf("读取数据成功!\n"); printf("按任意键继续.....\n"); system("pause"); system("cls"); menu(); }
下面是选择操作:
/*操作*/ void studychoose() { struct clerk* choose_create; int study_num; printf("输入选项(0-8)进行操作:"); scanf("%d",&study_num); switch(study_num) { case 1: choose_create=screate(); system("cls"); menu(); break; case 2: choose_create=vadd(); system("cls"); menu(); break; case 3: delnum(); break; case 4: stushow(); break; case 5: vfind(); break; case 6: statistical(); break; case 7: study_save(input_n);//把全局计效变量作实参 break; case 8: study_read(input_n);//把全局计效变量作实参 break; case 0: exit(0); break; default: printf("error\n"); break; } menu(); }
本人的问题是:用fwrite函数保存数据成功了。但是用fread函数读取数据,但是打印不显示。一个数据都打印不出来。问一下前辈们,
for(i=0;i<ij;i++) { if(fread(&stu[i],sizeof(stu),1,read_FILE)!=1) { printf("读取失败!\n"); exit(1); } }
这样读取能否正确?
解决方案
10
if(fread(&stu[i],sizeof(stu[i]),1,read_FILE)!=1)
这么读,原则上没什么问题,但最好和你写入的方式保持一致。
第一步先确认录入和打印都能正常运行,录入之后马上把数据打出来看看对不对。
第二步确认写文件能否正确,找个二进制编辑器打开文件看看。
这么读,原则上没什么问题,但最好和你写入的方式保持一致。
第一步先确认录入和打印都能正常运行,录入之后马上把数据打出来看看对不对。
第二步确认写文件能否正确,找个二进制编辑器打开文件看看。
10
fwrite(&stu,sizeof(stu),1,save_FILE))!=1不应该是fwrite(&stu[save_count],sizeof(stu),1,save_FILE))!=1吗
16
怎么写就怎么读,单步跟踪程序,判断判断每一步读到什么,分析原因
27
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
不要把
fopen(“…”,”…”);fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待
和
fopen(“…”,”…b“);fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
不要把
fopen(“…”,”…”);fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待
和
fopen(“…”,”…b“);fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了