Получение размера файла с помощью команды lseek в c - PullRequest
0 голосов
/ 28 августа 2018

Меня попросили найти размер файла командой usjng lseek (без использования stat), и я написал следующий код </p> <pre><code>int main() { char buf[100], fn[10]; int fd, i; printf("Enter file name\n"); scanf("%s", fn); fd = open(fn, O_RDONLY); int size = lseek(fd, 0, SEEK_END); printf("Size is %d", size); close(fd); }

Но я получаю -1 как размер файла, где я ошибаюсь

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

следующий предложенный код:

  1. чисто компилирует
  2. правильно проверяет наличие ошибок
  3. выполняет желаемую функциональность
  4. использует правильную типизацию переменных

и теперь предложенный код:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>

int main( void )
{
    char fn[10];
    int fd;
    printf("Enter file name\n");
    if( scanf("%9s", fn) != 1 )
    {
        fprintf( stderr, "scanf for file name failed\n" );
        exit( EXIT_FAILURE );
    }

    if( (fd = open(fn, O_RDONLY) ) < 0 )
    {
        perror( "open failed" );
        exit( EXIT_FAILURE );
    }

    off_t  size = lseek(fd, 0, SEEK_END);
    printf("Size is %ld", size);
    close(fd);
}
0 голосов
/ 28 августа 2018

С lseek документация доступна онлайн :

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
После успешного завершения lseek () возвращает результирующее смещение расположение в байтах от начала файла. На ошибка, значение (off_t) -1 возвращается, и errno устанавливается для указания ошибка.

Таким образом, вы должны проверить errno (распечатать его, если lseek вернет -1):

Список возможных ошибок по той же ссылке :

ОШИБКИ

   EBADF  fd is not an open file descriptor.  
   EINVAL whence is not valid.  Or: the resulting file offset would be
          negative, or beyond the end of a seekable device.  
   ENXIO  whence is SEEK_DATA or SEEK_HOLE, and the file offset is
          beyond the end of the file.  
   EOVERFLOW  The resulting file offset cannot be represented in an off_t.  
   ESPIPE fd is associated with a pipe, socket, or FIFO.  

В вашем случае это, скорее всего, EBADF.

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