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

在文本指定位置插入单词的C语言代码问题求助

文件写入位置异常的问题修复

问题根源

你的代码出现所有单词都写入文件末尾的情况,核心原因有两个:

  • 文件打开模式错误:使用"a"(追加模式)打开第二个文件时,C标准规定无论通过fseek设置到哪个位置,所有写入操作都会自动追加到文件末尾,fseek的偏移设置会被忽略。
  • 混用stdio与系统调用:同时使用stdio的FILE*和系统调用write,两者的缓冲区和文件指针维护是独立的,会导致位置偏移混乱,行为不可预期。

修复方案

  1. 将第二个文件的打开模式从"a"改为"r+"(读写模式,允许在文件任意位置写入,且不会清空原有内容);如果是二进制文件,建议用"r+b"避免换行符转换问题。
  2. 统一使用stdio库函数进行写入,替换write为fwrite,保证文件指针和操作的一致性。
  3. 若n代表字符位置而非字节偏移,需额外处理多字节编码(如UTF-8)的情况;假设n是字节偏移量,以下代码可直接使用。

修复后的代码

osAssert(3 == argc, "argc");
struct stat fInfo;
osAssert(-1 != stat(argv[1], &fInfo), "stat");
osAssert(S_ISREG(fInfo.st_mode), "prvi fajl nije reg");
osAssert(-1 != stat(argv[2], &fInfo), "stat");
osAssert(S_ISREG(fInfo.st_mode), "drugi fajl nije reg");

FILE *f1 = fopen(argv[1], "r");
osAssert(NULL != f1, "open");
// 替换打开模式为r+,支持读写任意位置
FILE *f2 = fopen(argv[2], "r+");
osAssert(NULL != f2, "open2");

int n;
char rec[MAX];
while(EOF != fscanf(f1, "%d %s", &n, rec)){
    printf("%d %s ", n, rec);
    // 使用fseek定位,确保位置正确
    osAssert(-1 != fseek(f2, n, SEEK_SET), "fseek");
    // 使用fwrite代替write,保持stdio操作一致性
    osAssert(strlen(rec) == fwrite(rec, 1, strlen(rec), f2), "fwrite");
}

fclose(f1);
fclose(f2);

额外说明

  • 如果写入后需要确保内容立即同步到磁盘,可以在fwrite后调用fflush(f2)。
  • 若n的值超过文件当前长度,写入会从文件末尾开始扩展,中间空隙会被填充为NULL字节(取决于系统实现)。

内容的提问来源于stack exchange,提问作者Marijam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:53:20