C语言中使用fseek实现文件随机写入的问题求助
问题分析与解决
你遇到的问题根源在于追加模式("a")的特性:根据C标准,当以"a"或"a+"模式打开文件时,所有写操作都会自动定位到文件末尾,不管你之前用fseek移动到了哪个位置。这就是为什么你明明fseek返回0(说明定位成功),但写入的内容还是跑到文件结尾的原因。
要实现在文件中间写入(覆盖原有内容),你需要使用读写模式"r+",这个模式不会截断文件,同时允许你定位到任意位置进行读写操作。
修改后的代码如下:
#include <stdio.h> int main() { FILE* t = fopen("ttt", "w"); fprintf(t, "1234567890"); fclose(t); // 使用r+模式打开,支持读写且不截断文件 t = fopen("ttt", "r+"); if (t == NULL) { perror("fopen failed"); return 1; } int result = fseek(t, 2, SEEK_SET); fprintf(stderr, "fseek result: %d\n", result); fprintf(t, "xxx"); fclose(t); return 0; }
运行这段代码后,文件ttt的内容会变成预期的12xxx67890。
额外注意事项
- "r+"模式要求文件必须预先存在,如果文件不存在,
fopen会返回NULL,所以需要添加错误检查。 - 如果操作的是二进制文件,建议使用
"rb+"和"wb+"模式,避免系统自动转换换行符导致的定位偏差。 - 如果你需要的是插入内容(而不是覆盖),这种方法不适用,你需要先把插入点之后的内容读取到内存,写入新内容后再把原有内容追加回去。
内容的提问来源于stack exchange,提问作者Fraser Orr
相关产品推荐
相关产品推荐

