📌  相关文章
📜  C程序,用另一个给定的单词查找和替换文件中的单词(1)

📅  最后修改于: 2023-12-03 15:00:13.523000             🧑  作者: Mango

C程序:查找和替换文件中的单词

概述

这是一个用C语言编写的程序,用于在文件中查找并替换单词。该程序可用于处理文本文件中的错误拼写,替换过时的术语等。

程序使用用户提供的单词(查找单词和替换单词),在指定文件中查找所有匹配项,并将其替换为用户提供的替换单词。程序将修改原始文件,因此,请务必在使用之前备份原始文件。

代码实现思路

该程序的实现基于以下步骤:

  1. 获取用户输入的文件路径,查找单词,替换单词。
  2. 打开文件并逐行读取。
  3. 在每一行中查找匹配的单词。
  4. 如果找到匹配的单词,则将其替换为替换单词。
  5. 将修改后的行写入一个临时文件。
  6. 关闭原始文件和临时文件。
  7. 删除原始文件,并将临时文件重命名为原始文件的名称。
代码实现细节

以下是该程序使用的主要函数及其作用:

  • int main():程序的入口点,获取用户输入的文件路径、查找单词和替换单词,并负责程序的流程控制。
  • int fileExists(char* filename):检查文件是否存在并返回一个整数值。
  • void replaceWord(char *filename, char *find, char *replace):执行单词替换操作,将原始文件中的“find”单词替换为“replace”。
  • void replaceAll(char *filename, char *find, char *replace):循环调用replaceWord函数以替换所有匹配“find”单词的字符串。
  • void writeTempFile(char *filename, char *tempfilename):将修改后的行写入临时文件。
  • void deleteOriginalFile(char *filename):删除原始文件。
  • void renameFile(char* oldname,char* newname):将临时文件重命名为原始文件。

以下是该程序的代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int fileExists(char* filename){
    FILE* file;
    if (file = fopen(filename, "r")){
        fclose(file);
        return 1;
    }
    return 0;
}

void replaceWord(char *filename, char *find, char *replace){
    char buffer[BUFSIZ];
    char *tempfilename = "temp.txt";
    FILE *fp = fopen(filename, "r");
    FILE *temp = fopen(tempfilename, "w");
    if (!fp){
        printf("Error: %s\n", strerror(errno));
        return;
    }
    if (!temp){
        printf("Error: %s\n", strerror(errno));
        return;
    }
    while (fgets(buffer, BUFSIZ, fp) != NULL){
        char *needle = strstr(buffer, find);
        while (needle != NULL){
            *needle = '\0';
            fputs(buffer, temp);
            fputs(replace, temp);
            buffer[strlen(buffer)] = *find;
            needle = strstr(buffer, find);
        }
        fputs(buffer, temp);
    }
    fclose(fp);
    fclose(temp);
    deleteOriginalFile(filename);
    renameFile(tempfilename, filename);
}

void replaceAll(char *filename, char *find, char *replace){
    char buffer[BUFSIZ];
    char *tempfilename = "temp.txt";
    FILE *fp = fopen(filename, "r");
    FILE *temp = fopen(tempfilename, "w");
    if (!fp){
        printf("Error: %s\n", strerror(errno));
        return;
    }
    if (!temp){
        printf("Error: %s\n", strerror(errno));
        return;
    }
    while (fgets(buffer, BUFSIZ, fp) != NULL){
        char *needle = strstr(buffer, find);
        while (needle != NULL){
            *needle = '\0';
            fputs(buffer, temp);
            fputs(replace, temp);
            buffer[strlen(buffer)] = *find;
            needle = strstr(buffer, find);
        }
        fputs(buffer, temp);
    }
    fclose(fp);
    fclose(temp);
    deleteOriginalFile(filename);
    renameFile(tempfilename, filename);
}

void writeTempFile(char *filename, char *tempfilename){
    char buffer[BUFSIZ];
    FILE *fp = fopen(filename, "r");
    FILE *temp = fopen(tempfilename, "w");
    if (!fp){
        printf("Error: %s\n", strerror(errno));
        return;
    }
    if (!temp){
        printf("Error: %s\n", strerror(errno));
        return;
    }
    while (fgets(buffer, BUFSIZ, fp) != NULL){
        fputs(buffer, temp);
    }
    fclose(fp);
    fclose(temp);
}

void deleteOriginalFile(char *filename){
    remove(filename);
}

void renameFile(char* oldname,char* newname){
    rename(oldname, newname);
}

int main(){
    char filename[256], find[256], replace[256];
    printf("Enter filename: ");
    scanf("%s", filename);
    printf("Enter word to find: ");
    scanf("%s", find);
    printf("Enter word to replace with: ");
    scanf("%s", replace);
    if (fileExists(filename)){
        replaceAll(filename, find, replace);
    } else {
        printf("Error: %s\n", strerror(errno));
        return 1;
    }
    return 0;
}
总结

该程序使用了C语言的基本I/O函数和字符串操作函数,可实现在文本文件中查找和替换单词的功能。然而,该程序仅仅是一个示例,仍需要根据实际情况进行相应的修改和改进。通过深入理解该程序,可以帮助程序员提高自己的C语言编程能力,并开发出更加实用和有效的C程序。