
-->Am 11:11 的相册 <-- -->Am 11:11 的网上硬盘<--
UNIX 下写的一个文件存取方式的小程序.
UNIX 下写的一个文件存取方式的小程序.
将内存链表方式转为文件形式.先写入后读取. 文件前半部分为对象结构 后阗部分为结构中的文字
这样,可以在结构中存放不定长的字符串.比如CString 类据说可以存放上G的文字.
无外乎就指针+重定位..就搞定的..当然系统内部实现起来比我讲的要麻烦的多了.
#i nclude <stdlib.h>
#i nclude <stdio.h>
#i nclude <string.h>
#i nclude <sys/types.h>
#define Max_Object 355 //对象个数
#define Max_Text 255 //字符个数
typedef struct _object
{
int x;
int y;
int width;
int height;
char *name;
char *text;
int No;
int NN;
}*Tobject,object;
object o[Max_Object];
int main(void)
{
FILE *f;
int i=0;
int Count=0;
long ci=0;
char *T,*T1;
fpos_t fp;
long fsize=0;
char *buf;
Tobject Ro;
printf("Object=%d,int=%d,char*=%d\n",sizeof(object),sizeof(int),sizeof(char*));
//对对象赋值
for (i=0;i<Max_Object;i++)
{
o[i].x=i+1;
o[i].y=i+1;
o[i].width=i+2;
o[i].height=i+2;
o[i].name=(char*)calloc(sizeof(char),Max_Text);
sprintf(o[i].name,"Hello");
o[i].text=(char*)calloc(sizeof(char),Max_Text);
sprintf(o[i].text,"World");
o[i].No=i+1;
}
//打开文件
if ((f=fopen("d","wb"))==(FILE*)0)
return 0;
//将对象内容写入文件
for (i=0;i<Max_Object;i++)
{
T=o[i].name;
o[i].name=(char*)(Max_Object*sizeof(object)+ci); //将 对象中 name 的指针转换为文件的实际位置
ci=ci+strlen(T)+1; //
T1=o[i].text;
o[i].text=(char*)(Max_Object*sizeof(object)+ci); //将 对象中 text 的指针转换为文件的实际位置
ci=ci+strlen(T1)+1;
fwrite(&o[i],1,sizeof(object),f);
o[i].name=T;
o[i].text=T1;
}
//将对象中文字写入文件
for (i=0;i<Max_Object;i++)
{
fwrite(o[i].name,1,strlen(o[i].name)+1,f);
//fwrite((char)0,1,1,f);
fwrite(o[i].text,1,strlen(o[i].text)+1,f);
//fwrite((char)0,1,1,f);
}
//对当前对象总数取反,相当于简单加密 并写入文件夹
Count=~Max_Object;
fwrite(&Count,1,sizeof(int),f);
fclose(f);
if ((f=fopen("d","rb"))==0) //开始读取文件
return 0;
fgetpos(f,&fp);
fseek(f,0,SEEK_END);
fsize=ftell(f);
fsetpos(f,&fp);
buf=(char*)calloc(sizeof(char),fsize+1); //分配内存大小
fread(buf,1,fsize,f);
fclose(f);
Ro=(Tobject)buf; //转换为对象存取
Count=0;
//取当前对象的个数 因为之前对象个数是加密存放的,所以这里比较麻烦一点点
//或许进行 SHR 32 操作后,再取反结果也是一样,没有试...笨人用笨法
Count=~buf[fsize-4];
Count=Count+(int)(~buf[fsize-3]<<8);
Count=Count+(int)(~buf[fsize-2]<<16);
Count=Count+(int)(~buf[fsize-1]<<24);
// for (i=4;i>0;i--)
// {
// //printf("%X,",buf[fsize-i]);
// if ((4-i)>0)
// Count=Count+((buf[fsize-i]>>((4-i)*8)));
// else
// Count=Count+(buf[fsize-1]);
// }
//Count;
printf("\n%X",Count);
//Count=(int)(char)(char*)(buf+fsize-4);
//Count=xa(int)(buf+fsize-4);
//printf("\n%08x",Count);
//调试时用的 if (Count<3)
if (Count>3)
for (i=0;i<Count;i++)
{
//将从文件中读取的内容输出
Ro=(Tobject)(buf+sizeof(object)*i);
printf("\nx=%d,y=%d,width=%d,height=%d",Ro->x,Ro->y,Ro->width,Ro->height);
printf("name=%s,",(char*)((int)buf+Ro->name));
printf("text=%s,No=%d",(char*)((int)buf+Ro->text),Ro->No);
}
return 0;
}
- 上一篇:LINUX链表的实现




