使用C文件操作在txt文件第5行后添加文本失败,求排查问题
问题分析与修正方案
你的代码存在多个关键问题,导致无法在指定位置添加内容:
1. 文件打开模式错误
你用"r"只读模式打开文件,这种模式下完全无法写入数据,调用fprintf会触发未定义行为。需要改为读写模式,比如"r+"(打开已存在的文件进行读写)。
2. fseek的偏移基准错误
代码里用fseek(f, 1, SEEK_SET),SEEK_SET是从文件开头计算偏移量,这意味着每次循环都会把文件指针移到文件开头+1的位置,永远不会向后遍历整个文件。正确的应该用SEEK_CUR,基于当前指针位置向后偏移1字节:
fseek(f, 1, SEEK_CUR);
3. 换行计数逻辑漏洞
- 初始调用
fgetc(f)读取了第一个字符,但后续循环里没有更新c的值(注释掉了c = fgetc(f)),导致一直用第一个字符判断是否是换行,逻辑完全错误。 - 即使修复了
fseek,当前逻辑会把第5个换行符作为结束条件,但你要在第5行之后添加内容,应该是找到第5个换行符的位置后写入新内容;另外如果文件不足5行,循环会无限执行。
4. 文本文件无法直接插入内容
即使前面的问题都修复了,直接在文件中间fprintf会覆盖后续的原有内容,而不是插入。标准C的文件操作不支持直接插入数据,正确的做法是通过临时文件中转:
- 打开原文件和一个临时文件;
- 把原文件前5行的内容复制到临时文件;
- 写入要添加的新内容到临时文件;
- 把原文件剩余的内容复制到临时文件;
- 关闭两个文件,删除原文件,将临时文件重命名为原文件名。
修正后的示例代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *src = fopen("file1.txt", "r"); FILE *temp = fopen("temp.txt", "w"); if (!src || !temp) { perror("Failed to open files"); return 1; } char buf[1024]; int line_count = 0; // 复制前5行到临时文件,到达第5行后插入新内容 while (fgets(buf, sizeof(buf), src) != NULL) { fputs(buf, temp); // 判断当前行是否以换行结尾(处理文件最后一行无换行的情况) if (buf[strlen(buf)-1] == '\n') { line_count++; if (line_count == 5) { fputs("I have appended a line\n", temp); } } } // 如果文件不足5行,在末尾添加新内容(可选逻辑) if (line_count < 5) { fputs("I have appended a line\n", temp); } fclose(src); fclose(temp); // 替换原文件 remove("file1.txt"); rename("temp.txt", "file1.txt"); return 0; }
内容的提问来源于stack exchange,提问作者Xtense
相关产品推荐
相关产品推荐

