二进制文件数据修改问题?

dfkoko 2006-11-22 12:41:21
修改一段老程序。
文件写入没问题,修改有问题,但不知出在哪?
代码如下:

void SvRcd0(void) //存文件,测试没有问题
{
int i,l;
unsigned char pw[6][8],ttt[10],pw0[12][8];
char flnm[10];
struct tm Crt;
Crt.tm_year=atoi(year)-1900;
Crt.tm_mon=atoi(mon)-1;
Crt.tm_mday=atoi(day);
sprintf(flnm,"%d%d",Crt.tm_year,Crt.tm_mon);//年月
if( (fp=fopen(flnm,"ab")) == NULL )
printf("Record File Error!!!");
else {
for(int jj=0;jj<6;jj++)
for(int kk=0;kk<24;kk++)
{
Crt.tm_hour=jj*4+kk/6; //小时
Crt.tm_min=(kk%6)*10; //10分钟
Crt.tm_sec=0;
CrtTm2 = mktime(&Crt);
sprintf(pw[0],"%2.2f",OpH[0][jj][kk]);
sprintf(pw[1],"%2.2f",OpH[1][jj][kk]);
sprintf(pw[2],"%2.2f",OpH[2][jj][kk]);
sprintf(pw[3],"%2.2f",OpH[3][jj][kk]);
sprintf(pw[4],"%2.2f",OpH[4][jj][kk]);
sprintf(pw[5],"%2.2f",OpH[5][jj][kk]);
fwrite(&CrtTm2,sizeof(long),1,fp);//写时间
for(i=0;i<6;i++)
{fwrite(pw[i],sizeof(pw[i]),1,fp);//写数据
}
}
fclose(fp);
}
}

void SvRcd1(void)//改写历史数据,有问题
{
int i,l;
unsigned char pw[6][8],ttt[10],pw0[12][8];
char flnm[10];
struct tm *Crt;
Crt->tm_year=atoi(year)-1900;
Crt->tm_mon=atoi(mon)-1;
Crt->tm_mday=atoi(day);
sprintf(flnm,"%d%d",Crt->tm_year,Crt->tm_mon);
if( (fp=fopen(flnm,"wb+")) == NULL )
printf("Record File Error!!!");
else {
long curpos;
curpos = ftell(fp);
fseek(fp, 0L, SEEK_END);
fseek(fp, curpos, SEEK_SET);
for(int jj=0;jj<6;jj++)
for(int kk=0;kk<24;kk++)
{
Crt->tm_hour=jj*4+kk/6;
Crt->tm_min=(kk%6)*10;
Crt->tm_sec=0;
CrtTm2 = mktime(Crt);
sprintf(pw[0],"%2.2f",OpH[0][jj][kk]);
sprintf(pw[1],"%2.2f",OpH[1][jj][kk]);
sprintf(pw[2],"%2.2f",OpH[2][jj][kk]);
sprintf(pw[3],"%2.2f",OpH[3][jj][kk]);
sprintf(pw[4],"%2.2f",OpH[4][jj][kk]);
sprintf(pw[5],"%2.2f",OpH[5][jj][kk]);
do{
long rtm;
char ntm[80];
struct tm srtm;
fread(&rtm,1,sizeof(long),fp); //读时间
if(abs(rtm-CrtTm2)<10)
{
for(i=0;i<6;i++)
{fwrite(pw[i],sizeof(pw[i]),1,fp);//时间后的数据改写
}

}
else {
fread(&ntm,1,48,fp);
}
}while(!feof(fp));
}

fclose(fp);
}
}
...全文
237 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
dfkoko 2006-12-02
  • 打赏
  • 举报
回复
当时任务赶的太紧了,后来没有再找错,我用追加的方法覆盖了.

我感觉也是定位的问题,但TC好久不用了,迷糊.

感谢chai2010(http://chaishushan.googlepages.com/)
chai2010 2006-11-22
  • 打赏
  • 举报
回复
大概看了以下,感觉是定位的问题。
每个写之前都需要重新定位:
do{
long rtm;
char ntm[80];
struct tm srtm;
fread(&rtm,1,sizeof(long),fp); //读时间

// 这里最好添加fseek!!!
if(abs(rtm-CrtTm2)<10)
{
for(i=0;i<6;i++)
{
fwrite(pw[i],sizeof(pw[i]),1,fp);//时间后的数据改写
}

}
else {
fread(&ntm,1,48,fp);
}
}while(!feof(fp));

另外,
for(i=0;i<6;i++)
{fwrite(pw[i],sizeof(pw[i]),1,fp);//时间后的数据改写
}
可以直接写为:
fwrite(pw,sizeof(pw),1,fp);

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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