fread读不到文件数据

DePhang 2016-06-21 12:09:41
#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);
}

}

这样读取是否正确?
...全文
736 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
DePhang 2016-06-22
  • 打赏
  • 举报
回复
谢谢各位前辈,和赵四老师的解答。 我用winhex查看了保存的二进制文件。字节是对的。说明文件完整保存了。 我也断点调试了,发现并没有读取到。因为我把问题想得太复杂了,忽略了一个基础问题:重新运行窗口,然后直接加载二进制文件的数据。 for(i=0;i<ij;i++) { if(fread(&stu[i],sizeof(stu),1,read_FILE)!=1) { printf("读取失败!\n"); exit(1); } } ij这个变量的值要么随机,要么为0.导致了循环失败. 于是: 我改成了 while(fread(&stu[i],sizeof(stu),1,read_FILE)==1) { //计次变量递增 } 再调用show函数,发现已经完整读取所有的数据。
paschen 2016-06-21
  • 打赏
  • 举报
回复
怎么写就怎么读,单步跟踪程序,判断判断每一步读到什么,分析原因
brookmill 2016-06-21
  • 打赏
  • 举报
回复
if(fread(&stu[i],sizeof(stu[i]),1,read_FILE)!=1) 这么读,原则上没什么问题,但最好和你写入的方式保持一致。 第一步先确认录入和打印都能正常运行,录入之后马上把数据打出来看看对不对。 第二步确认写文件是否正确,找个二进制编辑器打开文件看看。
brookmill 2016-06-21
  • 打赏
  • 举报
回复
这两行的意图显然不一致 for(save_count=0;save_count<ix;save_count++) if((fwrite(&stu,sizeof(stu),1,save_FILE))!=1)
DePhang 2016-06-21
  • 打赏
  • 举报
回复


补充一下,调试加载的结果是这样。完全打印不出来
小灸舞 版主 2016-06-21
  • 打赏
  • 举报
回复
fwrite(&stu,sizeof(stu),1,save_FILE))!=1不应该是fwrite(&stu[save_count],sizeof(stu),1,save_FILE))!=1吗
赵4老师 2016-06-21
  • 打赏
  • 举报
回复
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧