SEEK_CUR указывает на значение, которое кажется неправильным - PullRequest
0 голосов
/ 24 февраля 2020

Это программа из книги "C программирование абсолютного руководства для начинающих". Он использует fseek и SEEK_CUR. Когда дело доходит до печати на экран, я могу понять, почему он печатает «Z» правильно, но я не могу понять, почему он печатает «Y» правильно. Для fseek в пределах l oop код записывается как fseek (fptr, -2, SEEK_CUR), поэтому, безусловно, это должно означать, что он перемещается вниз на два байта от 'Z' и должен выводить 'X' вместо 'Y «? Заранее благодарны за Вашу помощь.

    // File Chapter29ex1.c

/* This program opens file named letter.txt and prints A through Z into the file.
It then loops backward through the file printing each of the letters from Z to A. */

#include <stdio.h>
#include <stdlib.h>
FILE * fptr;

main()
{
    char letter;
    int i;

    fptr = fopen("C:\\users\\steph\\Documents\\letter.txt","w+");

    if(fptr == 0)
    {
        printf("There is an error opening the file.\n");
        exit (1);
    }

    for(letter = 'A'; letter <= 'Z'; letter++)
    {
        fputc(letter,fptr);
    }

    puts("Just wrote the letters A through Z");


    //Now reads the file backwards

    fseek(fptr, -1, SEEK_END);  //minus 1 byte from the end
    printf("Here is the file backwards:\n");
    for(i= 26; i> 0; i--)
    {
        letter = fgetc(fptr);
        //Reads a letter, then backs up 2
        fseek(fptr, -2, SEEK_CUR);
        printf("The next letter is %c.\n", letter);
    }

    fclose(fptr);

    return 0;
}

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Обратный поиск двух байтов правильный.

Предположим, что текущая позиция файла в (непосредственно перед) Z. Стрелка указывает на следующий символ, который будет прочитан.

    XYZ
      ^

Z читается, и позиция читается находится сразу после Z (при следующем чтении будет указан конец файла).

    XYZ
       ^

При поиске в обратном направлении на два байта позиция файла будет помещена непосредственно перед Y, что означает, что при следующем чтении Y получится как ожидается:

    XYZ
     ^
0 голосов
/ 24 февраля 2020

Если вы хотите прочитать следующее письмо, вы вообще не копируете. Если вы хотите читать одно и то же письмо снова и снова, вам нужно будет делать резервные копии по одному пробелу после каждого чтения. Поэтому, чтобы прочитать предыдущее письмо, вам нужно сделать резервную копию двух пробелов.

...