我正在使用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
答案 0 :(得分:1)
"a"
模式意味着数据将被写入文件结尾。
尝试使用"r+"
模式(读取+写入)。
引自N1570 7.21.5.3 fopen函数:
6打开带附加模式的文件(&#39; a&#39;作为模式参数中的第一个字符) 导致对文件的所有后续写入被强制转换为当前的文件结束, 无论是对fseek功能的干预调用。
这意味着以"a"
模式打开的文件指针将忽略使用fseek
执行的操作。