在文本指定位置插入单词的C语言代码问题求助
文件写入位置异常的问题修复
问题根源
你的代码出现所有单词都写入文件末尾的情况,核心原因有两个:
- 文件打开模式错误:使用
"a"(追加模式)打开第二个文件时,C标准规定无论通过fseek设置到哪个位置,所有写入操作都会自动追加到文件末尾,fseek的偏移设置会被忽略。 - 混用stdio与系统调用:同时使用stdio的
FILE*和系统调用write,两者的缓冲区和文件指针维护是独立的,会导致位置偏移混乱,行为不可预期。
修复方案
- 将第二个文件的打开模式从
"a"改为"r+"(读写模式,允许在文件任意位置写入,且不会清空原有内容);如果是二进制文件,建议用"r+b"避免换行符转换问题。 - 统一使用stdio库函数进行写入,替换
write为fwrite,保证文件指针和操作的一致性。 - 若
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
相关产品推荐
相关产品推荐

