C语言以r+模式修改TXT文件行内容时丢失字符的解决求助
C语言替换TXT文件行内容时丢失下一行字符的问题修正
问题根源
你遇到的问题由两个原因导致:
- fseek偏移计算错误:代码中使用
-(strlen(line))-1作为偏移量,导致文件指针回退到旧行起始位置的前1个字节,写入新行时起始位置错误,覆盖了下一行的开头字符。 - 新旧行长度不一致:原旧行
Hello This is ABCD(含末尾换行符长度为19),新行Hello This was ABCD(含换行符长度为20),长度比旧行长1,即使偏移正确,直接覆盖也会破坏下一行内容。
解决方案
r+模式下直接覆盖仅适用于新旧行字节长度完全相同的场景。当长度不同时,最安全的做法是通过临时文件中转,避免破坏原文件后续内容,具体步骤如下:
- 打开原文件和一个临时文件
- 逐行读取原文件内容
- 判断每行是否为需要替换的旧行:是则写入新行,否则写入原行到临时文件
- 关闭文件后,删除原文件并将临时文件重命名为原文件名
代码示例
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { FILE *fp, *temp_fp; char line[256]; // 注意匹配原行的换行符,确保判断准确 const char *old_line = "Hello This is ABCD\n"; const char *updated_line = "Hello This was ABCD\n"; // 打开文件 fp = fopen("test.txt", "r"); temp_fp = fopen("temp.txt", "w"); if (!fp || !temp_fp) { perror("Failed to open file"); return 1; } // 逐行处理 while (fgets(line, sizeof(line), fp) != NULL) { if (strcmp(line, old_line) == 0) { fputs(updated_line, temp_fp); } else { fputs(line, temp_fp); } } // 关闭文件 fclose(fp); fclose(temp_fp); // 替换原文件 remove("test.txt"); rename("temp.txt", "test.txt"); return 0; }
仅当新旧行长度相同时的简化修正
如果确保新旧行字节长度完全一致,可以修正fseek的偏移量来修复问题:
// 读取旧行后,回退到旧行起始位置(假设line包含换行符) fseek(fp, -(long)strlen(line), SEEK_CUR); fputs(updated_line, fp);
此方法仅适用于新旧行长度严格相等的情况,否则仍会破坏后续内容。
内容的提问来源于stack exchange,提问作者Vinay K
相关产品推荐
相关产品推荐

