Ага, я вижу в чем дело. Он не использует пробелы, он использует байты NUL, что намного больше соответствует ожиданиям, но не отображается в вашем выводе.
В вашем примере кода, который показывает вывод, измените его на:
for(int c; (c = getc(fp)) != EOF;)
{
if (c == 0) c = '.'; // ADD ME
putchar(c);
}
Теперь он будет показывать точку каждый раз, когда появляется NUL-байт, который представляет дыру, которую вы искали.
Начиная с пустого файла txt2
и смещения поиска 2, он показывает:
ab..cd
Поскольку вы не видели байты NUL на своем терминале, это создавало впечатление, будто все было сдвинуто, и я на минуту почесал голову.
РЕДАКТИРОВАТЬ : ваш пост был бы намного яснее, если бы вы показывали содержимое файла txt2
до и после, потому что эти изменения накапливаются и их невозможно отслеживать, когда в игру входят байты NUL.
Это должно сработать:
#include <stdio.h>
static void showfile(FILE *fp, const char *which)
{
// using | characters to show the start and end of the buffer
// in case there are trailing blanks involved.
printf("File %s: |");
for (int c; (c = getc(fp)) !=EOF;)
{
if (c == 0) c = '.';
putchar(c);
}
printf("|\n");
}
int main (void) {
FILE *fp = fopen("txt2", "r+");
long offset = 3L; //trying to change offset to 1,2,3,...
printf("Running with offset = %ld\n", offset);
showfile(fp, "before");
rewind(fp);
fprintf(fp, "ab");
fseek(fp, offset, SEEK_CUR);
fprintf(fp, "cd");
rewind(fp);
showfile(fp, "after ");
fclose(fp);
return 0;
}
Затем запустить:
Running with offset = 2
File before: ||
File after : |ab..cd|
// rerun with previous file
Running with offset = 3
File before: |ab..cd|
File after : |ab..ccd|