C语言如何替换文本文件中连续出现两次的指定字符
问题修正方案
现有代码核心问题
- 基础语法错误:C标准库文件指针类型为
FILE(首字母大写),fopen的打开模式参数是字符串,需要用双引号包裹"r+" - 读写指针逻辑错误:
r+模式下读操作后文件指针会自动后移,直接执行fprintf会覆盖后续未读取的内容,且读写操作切换前必须调用fseek/fflush/rewind调整指针位置,否则属于未定义行为 - 写入时机错误:每次匹配到连续
e就写入当前行,会导致同一行被重复写入多次,正确逻辑是先替换完一行内所有符合规则的内容,再统一写入该行 - 边界访问隐患:循环判断条件为
line[i] != '\0',当i指向字符串最后一个有效字符时,访问line[i+1]会读取到结束符,虽然不会越界但属于无效判断,应该限制循环到strlen(line)-1位置
修正后代码
#include <stdio.h> #include <string.h> // 假设filename已经提前正确定义 int main() { const int maxChar = 101; // ASCII for 'e' const char replaceChar = '*'; char line[200]; // 存储处理后的所有行,大文件场景可改用临时文件中转方案 char processed_lines[1000][200] = {0}; int line_count = 0; int i; FILE *in_file = fopen(filename, "r+"); if (in_file == NULL) { // 可自行补充文件打开失败的处理逻辑 return 1; } // 第一步:读取所有行完成替换,暂存到内存 while (fgets(line, sizeof(line), in_file) != NULL) { int len = strlen(line); for (i = 0; i < len - 1; i++) { if (line[i] == maxChar && line[i + 1] == maxChar) { line[i] = replaceChar; line[i + 1] = replaceChar; // 跳过已替换的下一个字符,避免重复匹配 i++; } } strcpy(processed_lines[line_count], line); line_count++; } // 第二步:重置文件指针到起始位置 rewind(in_file); // 第三步:将处理后的内容写回原文件 for (i = 0; i < line_count; i++) { fprintf(in_file, "%s", processed_lines[i]); } // 截断文件,避免原文件长度大于处理后长度时残留旧内容 ftruncate(fileno(in_file), ftell(in_file)); fclose(in_file); return 0; }
补充说明
如果处理的是大文件,内存放不下全部内容,可以改用临时文件中转方案:先读取原文件逐行处理写入临时文件,处理完成后删除原文件,将临时文件重命名为原文件名即可,该方案也兼容r+模式的使用要求。
内容的提问来源于stack exchange,提问作者williamclarke69
相关产品推荐
相关产品推荐

