fopen и файлы размером более 2х ГБ

Тема в разделе "LANGS.C", создана пользователем samba, 19 апр 2007.

  1. samba

    samba New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    65
    Адрес:
    England
    Можно ли работать с файлами огромных размеров ч-з функции stdio,
    заметил что fopen может открыть только файлы с размером 2^16.
    Не предлагайте маппирование или функции апи из кернела и нтдлл,
    меня интересует именно stdio.
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    samba
    никаких проблем не вижу:
    Код (Text):
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <assert.h>
    4.  
    5. int main(int argc, char ** argv) {
    6.   FILE * fd;
    7.   unsigned char * buf;
    8.   const size_t bufsize = 4*1024*1024*sizeof(unsigned char); // 4 Mb
    9.  
    10.   buf = (unsigned char *)malloc(bufsize);
    11.   assert(buf);
    12.  
    13.   fd = fopen("test.bin", "wb");
    14.   if (fd) {
    15.     size_t size;
    16.  
    17.     size = 0;
    18.     memset(buf, 0, bufsize);
    19.  
    20.     while (size<=2*1024*1024*1024) {
    21.       fwrite(buf, 1, bufsize, fd);
    22.       size += bufsize;
    23.     }
    24.  
    25.     fclose(fd);
    26.   }
    27.  
    28.   fd = fopen("test.bin", "rb");
    29.   assert(fd);
    30.   if (fd) {
    31.     fread(buf, 1, bufsize, fd);
    32.     fclose(fd);
    33.   }
    34.  
    35.   free(buf);
    36.  
    37.   return EXIT_SUCCESS;
    38. }
    39.  
    40. /* [EOF] */
     
  3. samba

    samba New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    65
    Адрес:
    England
    спасибо за пример, но меня больше интересует открытие файлов от 2х Гб и больше ч-з fopen,
    и считывание из него строк ч-з fgets
     
  4. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    samba

    Только что нормально открыл файл размером в 4GB и прочитал два последних байта(fopen, fseek, fgets). Наверное это от реализации зависит, поддерживает ли fopen работу с большими файлами.
     
  5. samba

    samba New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    65
    Адрес:
    England
    Stiver
    а что за компилятор у тебя? можно ли открыть и прочесть файл скажем в 10 Гиг ?
    у меня MS VS 7.0.9466, может ли зависеть от параметров компиляции? выложи плиз
    что у тебя.
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Подозреваю, что надо открывать файл в binary mode
     
  7. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    samba

    У меня VC6 с его стандартными библиотеками, Win XP. Могу по идее попробовать на 25ти гигабайтном файле, но после обеда :) Код проще некуда:
    Код (Text):
    1.         char  d[3];
    2.     char *res;
    3.     FILE *fp;
    4.  
    5.     fp = fopen("---", "r");
    6.  
    7.     fseek(fp,-1,SEEK_END);
    8.  
    9.     res=fgets(d, 2, fp);
    10.  
    11.     printf("%d\n", d[0]);
    12.     printf("%d\n", d[1]);
    Компилировал как С (не С++).

    Update: нет, не могу попробовать :dntknw: Он запакован, а распаковать места нет. Кстати WinRar у таких больших файлов неправильно размер показывает.
     
  8. samba

    samba New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    65
    Адрес:
    England
    хм, создал новый проект, тот же код работает, открыл и пропарсил 2 файла, размером в 2,2 и 5,7 Гб, вот код,
    щас постараюсь понять почему то же не работало в другом проекте. Похоже дело в параметрах компиляции.

    Код (Text):
    1. int _tmain(int argc, _TCHAR* argv[])
    2. {
    3.  
    4.     if( FILE* f = fopen("1.txt","rb") )
    5.     {
    6.         while( !feof(f) )
    7.         {
    8.             char buffer[MAX_PATH];
    9.  
    10.             if( fgets(buffer,sizeof(buffer),f) )
    11.             {
    12.                 printf(buffer);
    13.             }
    14.         }
    15.         fclose(f);
    16.     }
    17.  
    18.     return 0;
    19. }
     
  9. samba

    samba New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    65
    Адрес:
    England
    разобрался, fopen действительно работает с большими файлами, глюки мои были