1.仅仅在控制台上显示,不改变原文件内容
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRLEN 1024
char * replace(char str[], char temp[]){
//将str中出现的字符串temp删除
char *p = strstr(str, temp);
while(p != NULL){
int len = strlen(temp);
for(p += len; *p != '\0'; p++){
*(p - len) = *p;
}
*(p - len) = '\0';
p = strstr(str, temp);
}
return str;
}
int main(int argc, char * argv[]){
if(argc != 2){//命令行参数错误
fprintf(stderr,"command error\n");
exit(-1);
}
//用以保存一行数据
char str[STRLEN + 1];
while(fgets(str, STRLEN, stdin) != NULL){
//遍历所有行,进行替换并输出
fputs(replace(str, argv[1]),stdout);
}
return 0;
}
2.覆盖原文件内容
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRLEN 1024
char * replace(char str[], char temp[]){
//将str中出现的字符串temp删除
char *p = strstr(str, temp);
while(p != NULL){
int len = strlen(temp);
for(p += len; *p != '\0'; p++){
*(p - len) = *p;
}
*(p - len) = '\0';
p = strstr(str, temp);
}
return str;
}
void copy(const char *desName, const char * srcName){
//将scrName文件复制到desName文件中
FILE * des = fopen(desName, "w"), * src = fopen(srcName, "r");
int ch;
while((ch = fgetc(src)) != EOF){
fputc(ch, des);
}
}
int main(int argc, char * argv[]){
if(argc != 3){//命令行参数错误
fprintf(stderr,"command error\n");
exit(-1);
}
FILE * fp = NULL;
if((fp = fopen(argv[2], "r")) == NULL){
//以只读方式打开需要删除字符串的文件
fprintf(stderr,"Error: Unable to open file\n");
exit(-1);
}
//用以保存一行数据
char str[STRLEN + 1];
//获取一个唯一的临时文件名
char tmpFileName[L_tmpnam];
tmpnam(tmpFileName);
FILE * tmp;
if((tmp = fopen(tmpFileName, "w")) == NULL){
//以只写模式打开一个临时文件
fprintf(stderr,"can't create file\n");
exit(-1);
}
while(fgets(str, STRLEN, fp) != NULL){
//遍历待删除文件中的每一行数据,同时将进行删除处理过后的字符串保存到临时文件中
fputs(replace(str, argv[1]),tmp);
}
//将打开的文件关闭
fclose(fp);
fclose(tmp);
//文件复制
copy(argv[2], tmpFileName);
//删除临时文件
remove(tmpFileName);
return 0;
}