急!!!怎么用文件指针修改记录
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
楼主可以去看下这个帖子,参考下,怎么写结构体,和读结构体,我写的那些代码