| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 971 人关注过本帖
标题:求教一个保存数据的问题
只看楼主 加入收藏
宋子奇
Rank: 1
等 级:等待验证会员
帖 子:2
专家分:0
注 册:2010-5-20
结帖率:0
收藏
已结贴  问题点数:20 回复次数:10 
求教一个保存数据的问题
以下代码的目的是将buff中的数据,每次400字节存入data_dat.dat文件中
    unsigned char buff[512*512]={0};
    int len = lineByte * bmpHeight;       //数据长度
    int tem = 0;
    FILE *fp;
    int i;

    for(i=0;i<bmpHeight*bmpWidth;i++)
    {
        buff[i] = *(pBmpBuf+i);
    }
    fp=fopen("data_dat.dat","ab");
    for(i=0;i*400<len;i++)
    {
        if((len-i*400)>400)
        {
            fseek(fp, 400,0);
             fwrite(buff,400, 1, fp);
        }
        else
        {   
            fseek(fp, 400,0);
            fwrite(buff,len-i*400, 1, fp);
            break;
        }
    }
    fclose(fp);

保存的数据不正确,请问是什么原因?多谢
搜索更多相关主题的帖子: 数据 保存 
2010-05-20 20:44
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:4 
在你的文件里保存的数据是什么样的呢?你用的是fwrite来将数据写入到文件里,fwrite用于的的二进制的文件,我猜想你的文件里的数据应该是一堆看不懂的乱码吧?因为文件里写入的是机器码!

愿用余生致力编程
2010-05-20 21:00
skyuser213
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:37
专家分:117
注 册:2010-5-9
收藏
得分:4 
保存的文件用二进制方式打开
2010-05-20 22:05
冥卫
Rank: 8Rank: 8
来 自:深山老林
等 级:蝙蝠侠
帖 子:280
专家分:772
注 册:2010-4-20
收藏
得分:4 
顶下
2010-05-20 22:46
sidooh
Rank: 4
等 级:业余侠客
帖 子:121
专家分:265
注 册:2009-6-26
收藏
得分:4 
        if((len-i*400)>400)
        {
            fseek(fp, 400,0);
             fwrite(buff,400, 1, fp);
        }
        else
        {   
            fseek(fp, 400,0);
            fwrite(buff,len-i*400, 1, fp);
            break;
        }
#define SEEK_SET 0   //stdio.h中定义
我觉得你一直在写前400个字节(因为每个分支都有fseek(fp, 400,0),回到文件起点),终于i足够大了,到了else部分还是在写前len-i*400个字节(小于400)

还有文件名应该为*.bmp吧
2010-05-20 23:11
zhujianiu
Rank: 4
等 级:业余侠客
帖 子:126
专家分:244
注 册:2010-5-14
收藏
得分:4 
我觉得你应该把ab wb rb 等属性好好看下!
2010-05-21 00:04
sidooh
Rank: 4
等 级:业余侠客
帖 子:121
专家分:265
注 册:2009-6-26
收藏
得分:0 
ab相当于
fp=fopen(...)
fseek(fp,0,2)

而它写数据之前用了fseek(fp,offset,0),指针到了文件起点,所以ab是没有错误的


[ 本帖最后由 sidooh 于 2010-5-21 00:14 编辑 ]
2010-05-21 00:09
zhujianiu
Rank: 4
等 级:业余侠客
帖 子:126
专家分:244
注 册:2010-5-14
收藏
得分:0 
ab 表示在原有的文件中追加二进制类容, 尽然要把buff以400个字节为单位以为二进的形式写入原文中,那么后面在用fseek定位不是很多次一举么?
而且容易出错,在用了ab属性后,你再定位都是没有用的! 她都会指向源文件的再末端!
2010-05-21 00:24
宋子奇
Rank: 1
等 级:等待验证会员
帖 子:2
专家分:0
注 册:2010-5-20
收藏
得分:0 
回复 8楼 zhujianiu
多谢各位,应该改成这样:
    fp=fopen("data_dat.dat","ab");
    for(tem=0;tem*400<len;tem++)
    {
        if((len-tem*400)>400)
        {
             fwrite(buff+tem*400,400, 1, fp);
        }
        else
        {   
            fwrite(buff+tem*400,len-tem*400, 1, fp);
            break;
        }
    }
fseek这个函数不需要,fwrite的第一个参数原来写的不对,现在没问题了
2010-05-21 08:19
sidooh
Rank: 4
等 级:业余侠客
帖 子:121
专家分:265
注 册:2009-6-26
收藏
得分:0 
回复 8楼 zhujianiu
原来如此,学习了

感谢你的指正
2010-05-22 09:16
快速回复:求教一个保存数据的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018191 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved