UNIX 下写的一个文件存取方式的小程序.

[ 2008-7-20 22:22:00 | By: AmLinger ]

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;
}

发表评论:

    大名:
    密码: (游客无须输入密码)
    主页:
    标题:
    正在载入数据,请稍候……