Programming and Application(编程与应用)


Content(目录)




Linux


MySQL
Office















 
PCNow 30-Day Free Trial, Remote PC Access
 
Logo_234x60

查找并替换程序


查找并替换程序

TURBO系列软件提供了一个十分实用的字符串查找程序GREP.COM,该程序可以在指定的一批文件中,查找一个
或具有一定特征的字符串,查到后在屏幕上显示出来。但是,它不能把指定的字符串同时替换成另外一个字符
串,然而在实际工作中,我们往往需要对一批文件中的指定字符串进行替换,如果使用编辑程序,则需要将文
件一个一个地调入编辑程序,分别进行处理,这是一项令人乏味的工作,使人不胜其烦。作者用TURBO C
2.0编写了一个字符串查找并替换程序FREP.C,经过编译,形成执行文件后可以在操作系统下批量地对指定文
件进行处理。

一、程序的设计原理

只在文件中查找指定的字符串是十分简单的,只需要使用TURBO C提供的库函数strcmp()即可以完成。其基
本过程是;
    ⑴用fgets()函数从文件中读一行内容;
  ⑵用strcmp()判断是否含有指定的字符串;
  ⑶如果有,就显示该行;
    ⑷判断是否是文件尾,若不是,则转⑴,重复上述过程,直至文件结尾。
    如果要将指定文件中的一字符串(searchstr)替换成另一字符串(replacestr),其步骤如下:
    ⑴用fgets()函数从文件中读一行内容;
    ⑵用strcmp()判断是否含有指定的字符串;
  ⑶对该行内容进行重复查找,每查到一个searchstr,替换为一个replacestr,直到将行上所有的
  searchstr均替换为replacestr为止;
  ⑷将替换好的该行内容写入一个临时文件;
  ⑸判断是否是文件尾,若不是,则转⑴,重复上述过程,直至文件结尾;
  ⑹关闭原文件和临时文件;
  ⑺将原文件改名为BAK文件,将临时文件改名为原文件名。

二、程序的使用方法

FREP不仅实现了GREP.COM的字符串查找功能,同时可以将找到的字符串替换为另外一个字符串,这为成批自动
替换文本文件中的数据提供的有力的手段。其命令格式为:
    FREP <文件名> <查找的字符串> [替换的字符串]
其中“文件名”是某一特定的文件名,不能用通配符“*”和“?”,且必须写上文件的扩展名;“查找的字符
串”和“替换的字符串”为任意合法的字符和数字的组合;“替换的字符串”是指把从文件中找到的“查找字
符串”转换成的字符串,如果省略此项,FREP程序只在指定文件中查找字符串,不进行替换工作。
如果要同时处理一批文件扩展名为TXT的文件,则可以使用DOS命令;
          FOR %a in (*.txt) do repl %a  ab  AB
就可以将当前目录下所有扩展名为TXT的文件中字符串ab替换成AB。

三、源程序清单
/********************************************************/
/*  程序名称: FREP.C 1.1                                */
/*  作    者: 董占山                                    */
/*  完成日期: 1995-11-17                                */
/*  用    途: 查找一字符串,并替换成指定字符串          */
/*  编译方法: 用下列命令编译连接可以得到FREP.COM:       */
/*  tcc -mt FREP                                        */
/*  tlink c:\tc\lib\c0t+frep,frep,,c:\tc\lib\cs\lib /t  */
/********************************************************/

#include <stdio.h>

/* 显示程序的使用方法 */
void help()
{
  printf("Usage  : \nFind and/or replace a string in a text file\n");
  printf("Syntex : \nFREP <filename> <find string> [replace string]\n");
  exit();
}

/* 查找指定文件中的字符串 */
void find(flnm,searchstr)
char *flnm,*searchstr;
{
  char str1[256];
  unsigned int i,l;
  FILE *f1;
  if ((f1 = fopen(flnm,"r"))==NULL) {
     printf("File not found !\n");
     help();
     }
  l = 0;
  do {
    fgets(str1,256,f1); /* 从文件中读取一行 */
    ++l;
    if (strstr(str1,searchstr)!=NULL) /* 有待查找的字符串吗? */
      printf("[%s] Line : %d %s",flnm,l,str1); /* 显示该行内容 */
  } while (! feof(f1));
  fclose(f1);
}

/* 查找指定文件中的字符串,并替换 */
void replace(flnm,searchstr,replacestr)
char *flnm,*searchstr,*replacestr;
{
  char str1[256],str2[256];
  char *p1,*p2,*p3;
  FILE *f1,*f2;
  unsigned int i,fslen,i1,i2,i3;
  char path[80],drive[3],dir[66],name[10],ext[5];
  if ((f1 = fopen(flnm,"r"))==NULL) {
     printf("File not found !\n");
     help();
     }
  if ((f2 = fopen("temp","w+"))==NULL) {
     printf("File not opened !\n");
     help();
     }
  fslen=strlen(searchstr);
  do {
    fgets(str1,256,f1); /* 从文件中读取一行 */
    i1=strlen(str1);
    p1=str1;
    p3=str2;
    while (strstr(p1,searchstr)!=NULL) { /* 查找的字符串在该行中吗? */
       p2 = strstr(p1,searchstr);
       i2=strlen(p2);
       i3=i1-i2;
       p1+=i3;
       for (i=0;i<i3;i++) *p3++=*p1++; /* 复制前i3个字符 */
       while (*p3++ = *replacestr++);  /* 复制替换字符串 */
       p3-=1;
       p1+=fslen;
       }
    while ((*p3++=*p1++)!='\0'); /* 复制该行中剩余的字符 */
    fputs(str2,f2); /* 写文件 */
    strcpy(str2,"");
  } while (!feof(f1));
  fclose(f1);
  fclose(f2);
  fnsplit(flnm,drive,dir,name,ext);
  strcat(strcpy(str1,name),".bak");
  if ((f1=fopen(str1,"r"))!=NULL) unlink(str1);
  if (rename(flnm,str1)!=0) /* 原文件改名为同名的BAK文件 */
    printf("Error : File [%s] cannot be not renamed to file [%s] !\n",flnm,str1);
  else if (rename("temp",flnm)!=0)  /* 将临时文件改名为原文件名 */
    printf("Error : File [temp] cannot be not renamed to file [%s] !\n",flnm);
}

/* 主程序 */
main(argv,argc)
int argv;
char *argc[];
{
  char *flnm,*searchstr,*replacestr;
  unsigned int findb=0,replaceb=0;
  printf("%s","FREP Version 1.1, Copyright (C) 1994,95 Dong Zhanshan\n");
  switch (argv) {
  case 3 : flnm = argc[1];    /* 查找字符串 */
	   searchstr = argc[2];
	   findb = 1;
	   break;
  case 4 : flnm = argc[1];    /* 替换字符串 */
	   searchstr = argc[2];
	   replacestr = argc[3];
	   replaceb = 1;
	   break;
  default : help();
  }
  if (flnm == "") help();
  if (findb) find(flnm,searchstr);
  if (replaceb) replace(flnm,searchstr,replacestr);
  return 0;
}
©董占山Zhanshan Dong

Post comments(留言)

Name(名字):

Comment(内容):


由Google提供

SunfineData Products|U's Bargain Network|Contact Me(与我联系)
© 1998-, 董占山, 版权所有, 欢迎转载文章链接。
转载文章和软件请注明出处(http://articles.sunfinedata.com/)。