Хорошо, я не совсем понимаю, что происходит, но кажется, что вы не можете доверять fseek
с SEEK_CUR
при использовании с файлами чтения / записи в этом случае (у меня Windows и стандартные функциикак известно, отличаются от Linux, что может быть проблемой)
РЕДАКТИРОВАТЬ: Ответ Эндрю подтверждает мои подозрения.Мое решение соответствует тому, что рекомендуют стандарты.
Что я сделал, чтобы обойти проблему, так это сам управлять позицией файла и искать ее, вместо того чтобы неявно полагаться на текущую позицию файла при вызове fseek
. * 1010.*
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *f;
f = fopen("inputData.txt", "w+b");
if (!f) { perror("cannot create input"); exit(1); }
int n = 5;
int i;
for (i = 1; i <= n; ++i) {
fwrite(&i, sizeof(int), 1, f);
}
int x;
int pos=0;
fseek(f, 0, SEEK_SET);
while (fread(&x, sizeof(int), 1, f) == 1) {
if (fseek(f, pos, SEEK_SET)) {perror("cannot seek");exit(1);}
pos += sizeof(int);
printf("%d %lu\n", x, ftell(f));
if (x % 2 == 0) {
x = x * 2;
} else {
x = 3 * x;
}
if (fwrite(&x, sizeof(int), 1, f) != 1) {perror("cannot write");exit(1);}
if (fseek(f, pos, SEEK_SET)) {perror("cannot seek");exit(1);}
}
fclose(f);
}
теперь вывод программы (с текущим смещением)
1 0
2 4
3 8
4 12
5 16
содержимое двоичного файла теперь (как и ожидалось для архитектуры с прямым порядком байтов):
03 00 00 00 04 00 00 00 09 00 00 00 08 00 00 00 0F 00 00 00
Так что это обходной путь, но, по крайней мере, он работает правильно.