发信人: yangcs() 
整理人: yangcs(2000-01-21 09:32:59), 站内信件
 | 
 
 
    好像以前灌过。
     把一个文件中的字符串替换成其它字符串。用\0d等输入十六进制数。
 作用:
 1.改游戏经验值等;
 2.工作里用,如把空格改成0:
   TH FILE \20 0
     以前用TPL时干过。
 3.把“QUIT”改成“RETU”;
 4.其它,如把一个可执行文件里的“C:”替换成“D:”。
 
 # include <stdio.h>
 # define N 1000
 main(n,v)
 int n;
 char *v[];
 {
 char c1,c2;
 int i,k,m,m0;
 long j,kk;
 char s[N],t[N],*x,*y;
 FILE *fp;
 if(n!=4)
   {
   puts("命令格式: TH 文件名 原字符串 新字符串");
   exit(1);
   }
 
 if((fp=fopen(v[1],"r+b"))==NULL)
   {
   printf("文件%s没找到!\n",v[1]);
   exit(2);
   }
 
 sscanf(v[2],"%s",s);
 sscanf(v[3],"%s",t);
 for(m=0,x=s,y=s;*x;)
    {
    if(*x=='\\')
      {
      c1=*(++x);
      c2=*(++x);
      ++x;
      *y++= (char)(to16c(c1) <<4) | to16c(c2);
      }
    else
      *y++ = *x++;
    ++m;
    }
 *y=0;
 
 for(m0=0,x=t,y=t;*x;)
    {
    if(*x=='\\')
      {
      c1=*(++x);
      c2=*(++x);
      ++x;
      *y++=(char) (to16c(c1) << 4) | to16c(c2);
      }
    else
      *y++=*x++;
    m0++;
    }
 *y=0;
 
 
 if(m!=m0)
   {
   puts("字符串不等长!");
   exit(3);
   }
 
 j=0l; k=0;
 kk=0;
 while(fread(&c1,1,1,fp)>0)
    {
    if(c1==s[k])
      k++;
    else
      {
      j++;
      if(k)
        {
        fseek(fp,j,0);
        k=0;
        }
      }
   if(k==m)
        {
        fseek(fp,j,0);
        fwrite(t,1,m,fp);
        k=0;kk++;j+=(long)m;
        fseek(fp,j,0);
        }
    }
 printf("项数:  %ld\n",kk);
 fclose(fp);
 }
 
 to16c(c)
 char c;
 {
 char i,j,k;
 k=0;
 j=c&0xdf;
 if((j>='A') && (j<='F'))
    k=10+j-'A';
 if((c>='0') && (c<='9'))
    k=c-'0';
 return(k);
 }
 
  --     欢迎到DOS版讨论一些核心问题和简单问题。
     那里有一只老羊——哈哈,天使——一条狼。
  ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 210.72.45.132]
  | 
 
 
 |