The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
fopen и open не открывают файлы больше двух ГБ, !*! Phantom Lord, 19-Дек-09, 10:51  [смотреть все]
Собственно, проблема в заголовке. Следующий код:
FILE *input = fopen(file_path, "rb");
успешно открывает файлы, но не более 2-х Гб, для которых fopen возвращает ноль.

Та же проблема, если использовать open:
int input = open(file_path, O_RDONLY);
open возвращает -1.

Компилирую так:
gcc -std=c99 main.c

Uname -a:
2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:04:26 UTC 2009 i686 GNU/Linux

gcc version 4.4.1

Уже с ног сбился, гуглил до посинения, нигде не встречал подобных тем, чтобы у кого-то такая проблема была.

  • fopen и open не открывают файлы больше двух ГБ, !*! const86, 14:02 , 19-Дек-09 (1)
    В самом начале файла перед инклудами написать
    #define _XOPEN_SOURCE 600
    или
    #define _GNU_SOURCE
  • fopen и open не открывают файлы больше двух ГБ, !*! shutdown now, 17:36 , 19-Дек-09 (2)
    >[оверквотинг удален]
    >Компилирую так:
    >gcc -std=c99 main.c
    >
    >Uname -a:
    >2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:04:26 UTC 2009 i686 GNU/Linux
    >
    >gcc version 4.4.1
    >
    >Уже с ног сбился, гуглил до посинения, нигде не встречал подобных тем,
    >чтобы у кого-то такая проблема была.

    -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE

  • fopen и open не открывают файлы больше двух ГБ, !*! jd, 19:37 , 19-Дек-09 (3)
    >open возвращает -1.

    Есть такая штука, которая называется errno и она обычно отвечает на многие вопросы. В частности, в моём мане open(2) написано:

    EFBIG  pathname refers to a regular file, too large to be opened; see  O_LARGEFILE  above.
                  (POSIX.1-2001 specifies the error EOVERFLOW for this case.)
    вероятно именно это у вас происходит (вы можете убедиться в этом, вызвав, например, perror(3)), а above написано:
     O_LARGEFILE
                  (LFS)  Allow files whose sizes cannot be represented in an off_t (but can be repre‐
                  sented in an off64_t) to be opened.  The _LARGEFILE64_SOURCE macro must be  defined
                  in  order  to  obtain  this definition.  Setting the _FILE_OFFSET_BITS feature test
                  macro to 64 (rather than using O_LARGEFILE) is the preferred  method  of  obtaining
                  method of accessing large files on 32-bit systems (see feature_test_macros(7)).
    что отвечает на все ваши вопросы. Всё это можно проделать самостоятельно.
  • fopen и open не открывают файлы больше двух ГБ, !*! аноним, 21:39 , 20-Дек-09 (5)
    Мне вот интересно, почему под FreeBSD никаких проблем с этим нет - без всяких костылей обычные open и seek работают с терабайтными файлами и 64битными смещениями. А у нас этот маразм.
    • fopen и open не открывают файлы больше двух ГБ, !*! Аноним, 01:34 , 21-Дек-09 (6)
      >Мне вот интересно, почему под FreeBSD никаких проблем с этим нет -
      >без всяких костылей обычные open и seek работают с терабайтными файлами
      >и 64битными смещениями. А у нас этот маразм.

      int fseek(FILE *stream, long offset, int whence);
      Действительно, очень интересно почему в FreeBSD это вдруг заработает ))

      Установка макроса говорит что ты знаешь что делаешь, и не собираешься пользоваться fseek.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру