Почему lseek возвращает 0? - PullRequest
2 голосов
/ 25 февраля 2009

lseek() должен возвращать позицию дескриптора файла.

Документация гласит:

После успешного завершения lseek () возвращает результирующее местоположение смещения измеряется в байтах от начало файла. В противном случае возвращается значение -1 и errno установлен для указания ошибка.

Проблема в том, что даже это не работает:

#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
printf("size off_t: %i\n", sizeof(off_t));

off_t pos;
pos = lseek(file, (off_t)0, SEEK_CUR);
printf("pos: %lli\n", pos);

// same result for SEEK_SET and SEEK_END
pos = lseek(file, (off_t)2352, SEEK_CUR);
printf("pos: %lli\n", pos);

Это дает мне:

size off_t: 8
pos: 0
pos: 0

Почему это? Есть ли альтернатива, чтобы найти текущее смещение, используя необработанные функции ввода / вывода? (read, open, lseek,…)

Редактировать 1:

Я попытался упростить пример.

Ответы [ 5 ]

6 голосов
/ 25 февраля 2009

Попробуйте добавить #include в начало.

См .: http://forums.macosxhints.com/archive/index.php/t-35508.html

По сути, поскольку вы не #include <unistd.h>, компилятор "угадывает", что lseek() возвращает целое число.

Вероятно, int имеет длину 4 байта, а поскольку PPC имеет порядок байтов с "прямым порядком байтов", вы получаете "верхние" 4 байта, которые равны нулю.

Включить unistd.h позволяет компилятору понять, что lseek() возвращает off_t, поэтому вы не потеряете половину байтов.

2 голосов
/ 25 февраля 2009

Что-то еще, возможно, что-то глупое. Я попробовал ваш код, как здесь:

#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    off_t pos;
    int file ;
    if((file = open("/Users/chasrmartin/.bash_history",O_RDONLY)) == -1){
        perror(argv[0]);
        exit(1);
    }
    printf("size off_t: %i\n", sizeof(off_t));

    pos = lseek(file, (off_t)0, SEEK_CUR);
    printf("pos: %lli\n", pos);

    // same result for SEEK_SET and SEEK_END
    pos = lseek(file, (off_t)2352, SEEK_CUR);
    printf("pos: %lli\n", pos);

    exit(0);
}

и получите такой результат:

bash $ gcc foo.c
bash $ ./a.out
size off_t: 8
pos: 0
pos: 2352

(Для определенности, это на Mac OS / X 10.5.6 на Intel.)

Update.

А может, это не глупо. Я только что попробовал это на PPC G5, и получил результаты, которые вы делаете.

Обновление 2

Хорошо, вот результат на КПП:

$ gcc foo.c
$ ./a.out
size off_t: 8
pos: 0
pos: 0
1 голос
/ 25 февраля 2009

Что это за файл? Это труба случайно? Потому что, если это не обычный файл, скорее всего, он не поддерживает поиск:

Поведение lseek () на устройствах, которые не могут искать, определяется реализацией. Значение смещения файла, связанного с таким устройством, не определено.

0 голосов
/ 25 февраля 2009

Я не уверен, что понимаю ваш вопрос, но вот несколько мыслей, которые могут помочь.

  • Смещение 0 действительно; это означает, что вы находитесь в начале файла
  • В зависимости от вашей платформы off_t может быть ограничено до 32 бит без знака.
  • Собираетесь ли вы искать относительно вашей текущей позиции?

- MarkusQ

0 голосов
/ 25 февраля 2009

Возможно, вы захотите изменить тест на:

if ( (pos = lseek(file, (off_t)i, SEEK_CUR)) != -1 ) {

Возможно, вы где-то нажимаете -1, но здесь вы тестируете на 0.

...