求救关于VC2005的一个文件读写问题

ffaannggyyuu 2011-07-28 09:14:47
我编写了一个BP网络,需要将权值和网络节点数等信息保存到文件,再重新读出调用。
现在n1,n2,n3(网络节点数)读写正确,但是权值都不对。哪位牛人帮我解决一下这个问题呀?急啊,不胜感激
n1,n2,n3是整型,权值是double型

下面是我的代码:
#define fastcopy(to,from,len)\
{\
register char *_to,*_from;\
register int _i,_l;\
_to = (char *)(to);\
_from = (char *)(from);\
_l = (len);\
for (_i = 0; _i < _l; _i++) *_to++ = *_from++;\
}


/* 保存BP网络 */
void bpnn_save(BPNN *net, char *filename)
{
int n1, n2, n3, i, j, memcnt;
double dvalue, **w;
char *mem;
FILE *fd;


if ((fd = fopen(filename, "w")) == NULL) {
printf("BPNN_SAVE: Cannot create '%s'\n", filename);
return;
}

n1 = net->input_n; n2 = net->hidden_n; n3 = net->output_n;
printf("Saving %dx%dx%d network to '%s'\n", n1, n2, n3, filename);
fflush(stdout);


fwrite((char *) &n1, sizeof(int), 1, fd);
fwrite((char *) &n2, sizeof(int), 1, fd);
fwrite((char *) &n3, sizeof(int), 1, fd);

memcnt = 0;
w = net->input_weights;
mem = (char *) malloc ((unsigned) ((n1+1) * (n2+1) * sizeof(double)));
for (i = 0; i <= n1; i++) {
for (j = 0; j <= n2; j++) {
dvalue = w[i][j];
fastcopy(&mem[memcnt], &dvalue, sizeof(double));
memcnt += sizeof(double);
}
}

fwrite(mem, (n1+1)*(n2+1)*sizeof(double), 1, fd);
free(mem);
// mem = (char *) malloc ((unsigned) ((n1+1) * (n2+1) * sizeof(double)));


memcnt = 0;
w = net->hidden_weights;
mem = (char *) malloc ((unsigned) ((n2+1) * (n3+1) * sizeof(double)));
for (i = 0; i <= n2; i++) {
for (j = 0; j <= n3; j++) {
dvalue = w[i][j];
fastcopy(&mem[memcnt], &dvalue, sizeof(double));
memcnt += sizeof(double);
}
}

fwrite(mem, (n2+1) * (n3+1) * sizeof(double), 1, fd);
free(mem);

fclose(fd);
return;
}


/* 从文件中读取BP网络 */
BPNN *bpnn_read(char *filename)
{
char *mem;
BPNN *new1;
int n1, n2, n3, i, j, memcnt;
FILE *fd;

if ((fd = fopen(filename, "r")) == NULL) {
return (NULL);
}

printf("Reading '%s'\n", filename); fflush(stdout);

fread((char *) &n1, sizeof(int), 1, fd);
printf("the input nods is:%d\n",n1);
fread((char *) &n2, sizeof(int), 1, fd);
printf("the hidden nods is:%d\n",n2);
fread((char *) &n3, sizeof(int), 1, fd);
printf("the output nods is:%d\n",n3);

new1 = bpnn_internal_create(n1, n2, n3);

printf("'%s' contains a %dx%dx%d network\n", filename, n1, n2, n3);
printf("Reading input weights..."); fflush(stdout);

memcnt = 0;
mem = (char *) malloc ((unsigned) ((n1+1) * (n2+1) * sizeof(double)));

fread( mem, (n1+1) * (n2+1) * sizeof(double), 1, fd);
for (i = 0; i <= n1; i++) {
for (j = 0; j <= n2; j++) {
fastcopy(&(new1->input_weights[i][j]), &mem[memcnt], sizeof(double));
//printf("%f\n",new1->input_weights[i][j]);
memcnt += sizeof(double);
}
}
free(mem);

printf("Done\nReading hidden weights..."); fflush(stdout);

memcnt = 0;
mem = (char *) malloc ((unsigned) ((n2+1) * (n3+1) * sizeof(double)));

fread( mem, (n2+1) * (n3+1) * sizeof(double), 1, fd);
for (i = 0; i <= n2; i++) {
for (j = 0; j <= n3; j++) {
fastcopy(&(new1->hidden_weights[i][j]), &mem[memcnt], sizeof(double));
memcnt += sizeof(double);
}
}
free(mem);
fclose(fd);

printf("Done\n"); fflush(stdout);

bpnn_zero_weights(new1->input_prev_weights, n1, n2);
bpnn_zero_weights(new1->hidden_prev_weights, n2, n3);

return (new1);
}
...全文
116 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ffaannggyyuu 2011-07-29
  • 打赏
  • 举报
回复
多谢楼上二位
发现了三个bug:
1、&mem[memcnt]应改为&(mem[memcnt])
2、"w"和"r"分别改为"wb"和"rb"
3、读写函数改为fread/fwrite(mem,sizeof(double),(n1+1)*(n2+1),fd)
之后就好用了
alexander_david 2011-07-29
  • 打赏
  • 举报
回复
你加上二进制标志试试:fd = fopen(filename, "wb") && fd = fopen(filename, "rb"))
shiyunqiang 2011-07-29
  • 打赏
  • 举报
回复
你跟踪调试一下,看看哪一步没有成功。
ffaannggyyuu 2011-07-29
  • 打赏
  • 举报
回复
有木有人解答一下?
ffaannggyyuu 2011-07-28
  • 打赏
  • 举报
回复
急啊,自己测试了一下,好像fastcopy并没有问题
应该是fwrite和fread出了问题,怎么解决啊?哪位牛人来帮帮忙吧

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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