Почему начало потока файлов C называется `SEEK_SET`? - PullRequest
0 голосов
/ 03 июня 2019

Есть три origin константы, которые вы можете использовать в таких функциях, как fseek, чтобы определить, откуда подсчитывается offset: SEEK_SET, SEEK_CUR и SEEK_END.SEEK_CUR и SEEK_END кажутся самоочевидными для обозначения текущей позиции и конца файлового потока, но почему SEEK_SET используется для обозначения начала?Почему не что-то вроде SEEK_BEG?

Ответы [ 2 ]

4 голосов
/ 03 июня 2019

Потому что вы можете добавить смещение.Используя SEEK_SET, вы можете явно установить смещение.(Добавив его в начало)

Из справочной страницы fseek:

The new position, measured in bytes, is
obtained by adding offset bytes to the position specified by whence.
If whence is set to SEEK_SET, SEEK_CUR, or SEEK_END, the offset is
relative to the start of the file, the current position indicator, or
end-of-file, respectively.

Из справочной страницы lseek:

   SEEK_SET
          The file offset is set to offset bytes.

   SEEK_CUR
          The file offset is set to its current location plus offset
          bytes.

   SEEK_END
          The file offset is set to the size of the file plus offset
          bytes.
1 голос
/ 04 июня 2019

Другой ответ на поставленный вопрос: «Потому что у fseek есть второй аргумент, который не всегда равен нулю».

Если вы всегда передаете второй аргумент как ноль, тогда SEEK_CUR установит указатель файла в его текущую позицию (что было бы почти бесполезным запретом), и SEEK_END установит указатель файла на конец файла, а SEEK_CUR установит его на начало файла, что может заставить вас задаться вопросом, почему он не называется SEEK_BEG.

Но, конечно, fseek имеет второй аргумент, и вы обычно передаете его как интересное ненулевое смещение. В большинстве случаев вторым аргументом является абсолютное смещение, к которому вы хотите стремиться, что и означает SEEK_SET. Для удобства вы также можете установить позицию плюс-или-минус текущую позицию, для которой SEEK_CUR, или плюс-или-минус конец файла, для которой SEEK_END.

В случае, если whence равно SEEK_SET, а смещение равно 0, что означает, что вы пытаетесь установить указатель файла на начало файла, возможно, должно быть удобный ярлык для этого тоже. Но ярлык не называется SEEK_BEG, это совершенно другая библиотечная функция: rewind(fp), которая действительно является ярлыком для fseek(fp, 0L, SEEK_SET).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...