数据附加到文件末尾而不是指定的偏移量

时间:2016-06-04 15:40:45

标签: c fseek

我正在使用4个文件,并希望在指定的偏移处为每个文件注入一个字符串。我正在使用#include <stdio.h> #include <string.h> #include <stdlib.h> #define SZ 14 #define TARGET_NUM 4 long GetFileSize(FILE *fp); int main(void) { long offset[TARGET_NUM] = { 10,15,20,25 }; const char *file_names[TARGET_NUM] = { "file1.txt", "file2.txt", "file3.txt", "file4.txt", }; char dat[TARGET_NUM][SZ + 1] = { { '1','0','0','0','0','0','0','0', '0','0','0','0','0','0', 0 }, { '0','1','0','0','0','0','0','0', '0','0','0','0','0','0', 0 }, { '0','0','1','0','0','0','0','0', '0','0','0','0','0','0', 0 }, { '0','0','0','1','0','0','0','0', '0','0','0','0','0','0', 0 }, }; FILE *fp[TARGET_NUM]; long f_size; for (size_t n = 0; n < TARGET_NUM; n++) { fp[n] = fopen(file_names[n], "a"); if (!fp[n]) { fprintf(stderr, "Error, file %s failed to open.\n", file_names[n]); goto cleanup; } f_size = GetFileSize(fp[n]); if (offset[n] < f_size) { fseek(fp[n], offset[n], SEEK_SET); fprintf(fp[n], "%s", dat[n]); } } cleanup: for (size_t n = 0; n < TARGET_NUM; n++) { if (fp[n]) { fclose(fp[n]); } } return 0; } long GetFileSize(FILE *fp) { fseek(fp, 0L, SEEK_END); long sz = ftell(fp); fseek(fp, 0L, SEEK_SET); return sz; } ,但数据被写入文件末尾而不是预期的偏移。为什么,我该如何解决它:

range.specialcells

1 个答案:

答案 0 :(得分:1)

"a"模式意味着数据将被写入文件结尾。

尝试使用"r+"模式(读取+写入)。

引自N1570 7.21.5.3 fopen函数:

  

6打开带附加模式的文件(&#39; a&#39;作为模式参数中的第一个字符)   导致对文件的所有后续写入被强制转换为当前的文件结束,   无论是对fseek功能的干预调用。

这意味着以"a"模式打开的文件指针将忽略使用fseek执行的操作。

相关问题