You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言以r+模式修改TXT文件行内容时丢失字符的解决求助

C语言替换TXT文件行内容时丢失下一行字符的问题修正

问题根源

你遇到的问题由两个原因导致:

  • fseek偏移计算错误:代码中使用-(strlen(line))-1作为偏移量,导致文件指针回退到旧行起始位置的前1个字节,写入新行时起始位置错误,覆盖了下一行的开头字符。
  • 新旧行长度不一致:原旧行Hello This is ABCD(含末尾换行符长度为19),新行Hello This was ABCD(含换行符长度为20),长度比旧行长1,即使偏移正确,直接覆盖也会破坏下一行内容。

解决方案

r+模式下直接覆盖仅适用于新旧行字节长度完全相同的场景。当长度不同时,最安全的做法是通过临时文件中转,避免破坏原文件后续内容,具体步骤如下:

  1. 打开原文件和一个临时文件
  2. 逐行读取原文件内容
  3. 判断每行是否为需要替换的旧行:是则写入新行,否则写入原行到临时文件
  4. 关闭文件后,删除原文件并将临时文件重命名为原文件名

代码示例

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:05:38