查找并替换程序
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;
}
|