首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

急如何用文件指针修改记录

2012-04-05 
急!!!怎么用文件指针修改记录LogID CreateDate Note Charge Balance1 2006-06-01 alimony 500.00 500.002

急!!!怎么用文件指针修改记录
LogID CreateDate Note Charge Balance
1 2006-06-01 alimony 500.00 500.00
2 2006-06-08 shopping -300.00 200.00
3 2006-06-15 shopping -60.00 140.00
4 2006-06-20 workingpay 200.00 340.00
5 2006-08-01 scholarship 1000.00 1340.00


这么一个dat后缀的文件,要求建立一个函数能修改其中的记录,红字部分每行是一个结构体里的,
应该怎么办呢?具体些吧。
这是我的一个代码,但总是乱码,为什么呢?
#include<stdio.h>
long size;
struct LogData
{
  long logid;
  char logdate[11];
  char lognote[15];
  double charge;
  double balance;
}; 


long getLogcount(FILE *cfptr)
{
long begin,end,logcount;
fseek(cfptr,32*sizeof(char),SEEK_SET);
begin=ftell(cfptr);
fseek(cfptr,0L,SEEK_END);
end=ftell(cfptr);
logcount=(end-begin)/size;
return logcount;
}
void UpdateCashLog(FILE *cfptr)
{
struct LogData Change[100];
  long i,n;
  long logcount;
logcount=getLogcount(cfptr);
  fseek(cfptr,36*sizeof(char),SEEK_SET);
  for(i=1;i<=logcount;i++)
  {
fread(&Change[i],size,1,cfptr);
  }

  printf("Please enter the LogID which you want to recompose:\n");
scanf("%ld",&n);

  for(i=1;i<=logcount;i++)
  {
if(Change[i].logid=n)
{
printf("Input logdate(format:2006-01-01):");
scanf("%s",Change[i].logdate);
  printf("Input lognote:");
  scanf("%s",Change[i].lognote);
  printf("Input charge: income+ and expand-:");
  scanf("%lf",&Change[i].charge);
Change[i].balance=Change[i-1].balance+Change[i].charge;
break;
 
}
  }
  
  fseek(cfptr,36*sizeof(char),SEEK_SET);
  for(i=1;i<=logcount;i++)
{
fwrite(& Change[i],size,1,cfptr);
}


}


int main()
{
  FILE *fp;

  if((fp=fopen("d:\\cashbox.dat","rb+"))==NULL)
  {
  printf("cannot open file cashbox.dat!\n");
  exit(0);
  }
  size=sizeof(struct LogData)+1;
  UpdateCashLog(fp);
  
 
  fclose(fp);


return 0;

}

[解决办法]
文件本身不是直接以结构体的方式写入的,不能直接fread

你需要用fscanf读取并拆解结构体的每个成员
[解决办法]
文件不能在打开后直接修改的,这样只是替换而已。

最好就是顺序读,写入另一文件temp,最后再将temp改为原来的文件。
[解决办法]
我建议你使用fscanf()和fprintf();这样读取具有规律的文件数据是比较好的。你使用freed()读取,需要制定读取的长度,而这两个函数一个读,一个是写就不用指定长度,但要制定个数。
[解决办法]
http://topic.csdn.net/u/20120304/11/fc1e79f8-d1eb-46f6-a6c5-2fe1866a0997.html?seed=1971070876&r=77764074#r_77764074
楼主可以去看下这个帖子,参考下,怎么写结构体,和读结构体,我写的那些代码

热点排行