Как узнать, работает ли курсор смещения в EOF только с помощью lseek()
?Как узнать, является ли курсор смещения в EOF с помощью lseek()?
ответ
lseek
возвращает (новое) положение. Если это приемлемо, что позиция файла находится в конце после испытания, следующие виды работ:
off_t old_position = lseek(fd, 0, SEEK_CUR);
off_t end_position = lseek(fd, 0, SEEK_END);
if(old_position == end_position) {
/* cursor already has been at the end */
}
Теперь курсор находится в конце, уже ли это было или нет; чтобы вернуть его обратно, вы можете сделать lseek(fd, old_position, SEEK_SET)
.
(я пропустил проверку на наличие ошибок (возвращаемое значение (off_t)-1
) ради краткости, не забудьте включить их в реальном коде.)
Альтернативным, но используя другую функцию, будет запрашивать текущую позицию как указано выше, и fstat
файл, чтобы увидеть, соответствует ли поле st_size
текущей позиции.
Как примечание, состояние с истекшим файлом устанавливаются для потоков (FILE *
, а не int
файловых дескрипторов) после попытки чтения после конца файла, курсор будучи в конце не хватает (то есть этот подход не является файловым дескриптором, эквивалентным feof(stream)
).
Не будет ли поле 'st_size', задающее размер файла * равным * в позиции' SEEK_END'? (Как и в случае с массивом, один за макс индексом является размером). 'SEEK_END' устанавливает следующую позицию для записи, а не в последний байт. –
@WeatherVane, да, вы правы. Спасибо, отредактирован. – mafso
Почему вы хотите это сделать? Самое близкое, что я могу подумать, это дважды вызвать его и сравнить возвращаемые значения 'if (lseek (fd, 0, SEEK_CUR) == lseek (fd, 0, SEEK_END))', который также устанавливает положение файла до конца. «В настоящее время в« EOF »немного неясно, условие EOF задается после попытки прочесть последний байт, а не в том случае, если позиция файла находится в конце. – mafso
@mafso: Я бы сказал, что вы называете «ближайшим» * - это компактная версия правильного ответа. Так почему бы не сделать это ответом? – alk