2015-01-18 7 views
1

Как узнать, работает ли курсор смещения в EOF только с помощью lseek()?Как узнать, является ли курсор смещения в EOF с помощью lseek()?

+1

Почему вы хотите это сделать? Самое близкое, что я могу подумать, это дважды вызвать его и сравнить возвращаемые значения 'if (lseek (fd, 0, SEEK_CUR) == lseek (fd, 0, SEEK_END))', который также устанавливает положение файла до конца. «В настоящее время в« EOF »немного неясно, условие EOF задается после попытки прочесть последний байт, а не в том случае, если позиция файла находится в конце. – mafso

+1

@mafso: Я бы сказал, что вы называете «ближайшим» * - это компактная версия правильного ответа. Так почему бы не сделать это ответом? – alk

ответ

2

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)).

+1

Не будет ли поле 'st_size', задающее размер файла * равным * в позиции' SEEK_END'? (Как и в случае с массивом, один за макс индексом является размером). 'SEEK_END' устанавливает следующую позицию для записи, а не в последний байт. –

+0

@WeatherVane, да, вы правы. Спасибо, отредактирован. – mafso