| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1837 人关注过本帖
标题:[求助]什么叫 计算文件内偏移?(内有完整代码)
只看楼主 加入收藏
Still_Linux
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-1-4
收藏
 问题点数:0 回复次数:8 
[求助]什么叫 计算文件内偏移?(内有完整代码)

#include "process.h"
#include "stdlib.h"
#include "stdio.h"
#include "graphics.h"
#include "conio.h"
void save_all(char *filename) /*保存全屏子函数*/
{
FILE *fp;
unsigned long size =imagesize(0,0,639,120); /*设置屏幕1/4大小单位保存尺寸*/
unsigned long save_1;
int save_i;
char *buffer;
fp=fopen(filename,"wb");/*新建或者打开图形数据文件*/
buffer=(char *)malloc(size);/*申请1/4屏幕大小空间*/
for(save_i=0;save_i<4;save_i++)/*分4次保存屏幕*/
{
save_1=38726L*save_i;/*计算文件内偏移*/
fseek(fp,save_1,SEEK_SET);/*文件内偏移定位*/
getimage(0,120*save_i,639,120*(save_i+1),buffer);/*取屏幕内容到内存*/
fwrite(buffer,size,1,fp);/*将内存数据写入文件*/
}
free(buffer);/*释放内存*/
fclose(fp);
}
void load_all(char *filename) /*恢复全屏子函数*/
{
FILE *fp;
unsigned long size=imagesize(0,0,639,120);
unsigned long load_1;
int load_i;
char *buffer;
if((fp=fopen(filename,"rb"))==NULL)
{
setcolor(12);
outtextxy(450,460,"<File not found!>");
fclose(fp);
return;
}
buffer=(char *)malloc(size);/*申请1/4屏幕的内存*/
for(load_i=0;load_i<4;load_i++) /*分4次恢复图象到屏幕*/
{
load_1=38726L*load_i;/*文件内偏移定位*/
fseek(fp,load_1,SEEK_SET);/*文件内偏移定位*/
fread(buffer,size,1,fp);/*将文件内数据读取到内存*/
putimage(0,120*load_i,buffer,COPY_PUT);/*将内存数据显示到屏幕*/
}
free(buffer);/*释放内存*/
fclose(fp);
}

void main()
{
int driver=DETECT,mode=0,i;
initgraph(&driver,&mode,"");
randomize();
for(i=0;i<100;i++)
setcolor(rand()%16);
circle(rand()%getmaxx(),rand()%getmaxy(),rand()%100);
save_all("screen.dat");
getch();
cleardevice();
getch();
load_all("screen.dat");
getch();
closegraph();
}


这段代码中有几个地方我不理解
主要就是保存屏幕图象时候的 计算文件内的偏移 这个是怎么回事呢?


for(save_i=0;save_i<4;save_i++)/*分4次保存屏幕*/
{
save_1=38726L*save_i;/*计算文件内偏移*/
fseek(fp,save_1,SEEK_SET);/*文件内偏移定位*/
getimage(0,120*save_i,639,120*(save_i+1),buffer);/*取屏幕内容到内存*/
fwrite(buffer,size,1,fp);/*将内存数据写入文件*/
}


主要解释一下这里就行了 非常感谢

搜索更多相关主题的帖子: save include 偏移 文件 
2007-02-22 17:31
C语言学习者
Rank: 4
等 级:贵宾
威 望:13
帖 子:1278
专家分:0
注 册:2006-9-26
收藏
得分:0 
大概改变指针位置。

谁有强殖装甲第二部,可以Q我460054868
2007-02-22 19:18
ddosdo
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-2-22
收藏
得分:0 

顶上~变量控制指针的偏移量.(对这方面还不懂)

我C菜鸟.~近段时间准备攻JAVA.C暂时不想深究.


?一個亼, ?不想隱藏.
2007-02-22 21:56
Still_Linux
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-1-4
收藏
得分:0 

这个问题我已经找到答案了,看来还是有许多朋友不太明白这里怎么回事!我就把别人的回复发上来吧,大家一起搞明白具体怎么回事
如下:

确实是38726。你在程序中加入测试语句,如下:

...
fp=fopen(filename,"wb");//新建或者打开图形数据文件
buffer=(char *)malloc(size);//申请1/4屏幕大小空间
printf("%ld",size);
for(save_i=0;save_i<4;save_i++){//分4次保存屏幕
...

就可以得到size=38726的结论,我测试过。
我只能做一部分的解释:
int fseek(FILE *stream,long offset,int fromwhere) 函数把文件指针移到fromwhere
所指位置的向后offset个字节处,fromwhere可以为以下值:
SEEK_SET 文件开关 SEEK_CUR 当前位置 SEEK_END 文件尾

因此图形占多大空间,就应当分配多大偏移量,以存放文件。
至于具体的38726怎么来的,就不知道了。
本问题的图形大小理论上应当分配640*121*16(颜色)=1239040bits,但是这样文件太大了,所以应当采用一定的压缩图形的算法,图形压缩后得到的bits数就应当是38726。但是具体的压缩算法我就不知道了。


我自己理解的意思就是要计算出写入文件的位置,要不可能原来的数据会被覆盖吧,不知道能否用追加写入文件的方法呢?不解!请指教!

[此贴子已经被作者于2007-2-23 7:38:48编辑过]


鑷村姏浜庤嫳鏂囧?涔狅紝缈昏瘧涓嶅噯纭?紝璇峰ぇ瀹惰?璋咃紒
2007-02-23 07:35
多维数组
Rank: 1
等 级:新手上路
帖 子:238
专家分:0
注 册:2006-8-16
收藏
得分:0 
以下是引用ddosdo在2007-2-22 21:56:02的发言:

顶上~变量控制指针的偏移量.(对这方面还不懂)

我C菜鸟.~近段时间准备攻JAVA.C暂时不想深究.

我晕,C这种面向过程语言都不掌握好,就像攻面向对象语言
还嫩点吧......


有事发邮件:tzp_1210@
2007-02-23 08:35
多维数组
Rank: 1
等 级:新手上路
帖 子:238
专家分:0
注 册:2006-8-16
收藏
得分:0 
我只知道偏移地址是指在硬盘中的地址。。。

有事发邮件:tzp_1210@
2007-02-23 08:37
Still_Linux
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-1-4
收藏
得分:0 
以下是引用多维数组在2007-2-23 8:37:53的发言:
我只知道偏移地址是指在硬盘中的地址。。。

在硬盘中的地址? 不是内存中的地址吗?他们之间有什么区别吗?多说点啊...谢谢 ~~说这一点!!我都不懂呐


鑷村姏浜庤嫳鏂囧?涔狅紝缈昏瘧涓嶅噯纭?紝璇峰ぇ瀹惰?璋咃紒
2007-02-23 09:11
showay
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2009-5-20
收藏
得分:0 
38726后边还一个L啊,这个L是什么意思?
2009-09-14 10:33
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
这代码写得很差。38726L应该写成size

今天比较无聊,随便改了改:
程序代码:
#include "process.h"
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#include "graphics.h"
#include "conio.h"

#define SCREENX 640
#define SCREENY 480
#define SA_NPART 4

int save_all(char *filename) /* 保存全屏子函数 */
{
    FILE *fp;
    int i;
    void *buffer;

    /* 设置屏幕1/4大小单位保存尺寸 */
    unsigned long size = imagesize(0, 0, SCREENX - 1, SCREENY / SA_NPART);

    /* 新建或者打开图形数据文件 */
    if ((fp = fopen(filename, "wb")) == NULL)
        return 0;

    /* 申请1/4屏幕大小空间 */
    buffer = malloc(size);

    for (i = 0; i < SA_NPART; ++i)/* 分4次保存屏幕 */
    {
        fseek(fp, size * i, SEEK_SET);/* 文件内偏移定位 */
        getimage(0, SCREENY / SA_NPART * i, SCREENX - 1,
                SCREENY / SA_NPART * (i + 1), buffer);/* 取屏幕内容到内存 */
        fwrite(buffer, size, 1, fp);/* 将内存数据写入文件 */
    }

    free(buffer);/* 释放内存 */
    fclose(fp);

    return 1;
}

int load_all(char *filename) /* 恢复全屏子函数 */
{
    FILE *fp;
    int i;
    void *buffer;
    unsigned long size = imagesize(0, 0, SCREENX - 1, SCREENY / SA_NPART);

    if ((fp = fopen(filename, "rb")) == NULL)
        return 0;

    buffer = malloc(size);/* 申请1/4屏幕的内存 */

    for (i = 0; i < SA_NPART; ++i) /* 分4次恢复图象到屏幕 */
    {
        fseek(fp, size * i, SEEK_SET);/* 文件内偏移定位 */
        fread(buffer, size, 1, fp);/* 将文件内数据读取到内存 */
        putimage(0, SCREENY / SA_NPART * i, buffer, COPY_PUT);/* 将内存数据显示到屏幕 */
    }

    free(buffer);/* 释放内存 */
    fclose(fp);

    return 1;
}

void main()
{
    int driver = DETECT, mode = 0, i;
    initgraph(&driver, &mode, "");
    srand((unsigned)time(NULL));
    for (i = 0;i < 100;i++)
    {
        setcolor(rand() % 16);
        circle(rand() % getmaxx(), rand() % getmaxy(), rand() % 100);
    }
    save_all("screen.dat");
    getch();
    cleardevice();
    getch();
    load_all("screen.dat");
    getch();
    closegraph();
}



[ 本帖最后由 StarWing83 于 2009-9-14 14:10 编辑 ]

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-09-14 13:49
快速回复:[求助]什么叫 计算文件内偏移?(内有完整代码)
数据加载中...
 
   



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

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