Загрузка файла с помошью malloc в память.

Тема в разделе "LANGS.C", создана пользователем ajak, 6 окт 2008.

  1. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Привет!!! Народ, подскажите, как считать файл в память которая выделяется для файла динамически функцией. Ведь файл бывает у меня разного размера. А то, когда я указываю точный размер буффера - то всё нормально, а если через malloc, то выкидывает. Приведите пример плиз. И как обращаться потом к данным внутри буфера, т.е. уже к образу файла побайтово?
    Спасибо.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Код (Text):
    1. char* pBuff = malloc(size);
    2. if (pBuff)
    3. {
    4.   fread(hFile, 1, size, pBuff);
    5.   char simb = *pBuff [size-1];
     
  3. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Код (Text):
    1. char simb = *pBuff [size-1];
    А это зачем, не пойму,
    Ну я так почти и делаю, выкидывает только, не пойму почему.
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Код (Text):
    1. char simb = pBuff [size-1];
    Ну это типо обращение к последнему элементу массива. * не надо ;)
     
  5. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    А почему здесь на printf выкидывает?
    Это потому что нету конца строки?

    #include <stdio.h>
    void main()
    {
    FILE *in;
    long size;
    unsigned char *buf;
    in=fopen("c:\\11.bin","rb");
    fseek(in,0,SEEK_END);
    size=ftell(rom);
    fseek(in,0,SEEK_SET);
    fread(buf,1,4,in);
    printf("%x",buf[0]);
    printf("\n%ld",size); /////////////// LD


    }
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Странные вещи делаешь:
    ftell(rom); - что такое rom?
    Где выделение памяти под buf?
    В конце не помешало-бы fclose
     
  7. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Ну имеется ввиду in
    А я разве память не выделил? Я ж указатель поставил

    [​IMG]
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Нет, указатель это штука которая указывает на область памяти, а эту область памяти надо ещё иметь.
    buf = (unsigned char*)malloc(size);
     
  9. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    БУдем учиться над ошибками :)
     
  10. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    А почему у меня всё равно правильное значение выводиться, а потом выкидывает это из-за того что нету конца строки?
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Нет, приведи полный исподник, тада поглядим.
     
  12. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    еще на заметку: а кто будет проверять, что файл успешно открылся?
     
  13. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    У меня виснет теперь, что за на
    :dntknw:
    Borland c++visual

    Вот так напрочь подвисает когда ставлю развер 100, когда 4 байта читает в буфер, всё прокатывает, а когда 100 виснет напрочь.
    Посмотрите плиз

    Ругается на ntvdm.exe какой то
    вот код

    Код (Text):
    1. #include <stdio.h>
    2. #include <iostream.h>
    3. #include <stdlib.h>
    4. void main()
    5. {
    6.  FILE *rom;
    7.  long size;
    8. // unsigned char buf[20];        
    9.  
    10.  rom=fopen("c:\\1.txt","rb");
    11.  fseek(rom,0,SEEK_END);
    12.  size=ftell(rom);
    13.  fseek(rom,0,SEEK_SET);
    14.  
    15.  unsigned char *buf=(unsigned char*)malloc(size);
    16.  fread(buf,1,100,rom); // здесь 100 и 4 копирую
    17. // cout <<hex<< buf[0] << '\n';
    18.  printf("%x",buf[0]);
    19. // printf("\n%ld",size);  /////////////// LD
    }
    Ха... Народ. Я вообще ничего не понимаю . Все эти ошибки происходят почему то с этим файлом , на остальном -всё нормально, загрузите , проверьте -сами убедитесь

    http://slil.ru/26211615
     
  14. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    1. fopen/malloc/fread все возвращают флаг успешности. ты не удосуживаешь себя проверять то, успешно или нет эти ф-ции отработали. я тебе в посте выше про это уже говорил
    2. fread(buf,1,100,rom); // здесь 100 и 4 копирую
    что это такое? ты говоришь прочесть из открытого файла в буффер 1 элемент, размер которого равен 100. а нахрена тогда заморачивалса выше и выделял буффер динамически исключительно равный размеру файла? короче надо так:
    Код (Text):
    1. long result = fread(buf, 1, size, rom);
    2. if (result != size) {fputs ("Reading error",stderr); return 1;}
    3. а кто за тебя fclose(rom); делать будет?
    4. а кто за тебя будет освобождать выделенный кусок памяти: free(buf); ??
    ps: язык Си требует к себе уважения и хорошего понимания. каждый свой "шаг" нужно(желательно) контролировать.
     
  15. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    нет я понимаю, что так надо, ну с другим файлом же работает а с этим нет, вот скачайте себе, плиз, проверьте , знатоки си.

    Ну а если я размер файла в функции read поставлю, у меня система намерто зависает, а когда 100 , не так сильно.
     
  16. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    ajak
    Предлагаю почитать книжки (азбуки и далее по списку)
     
  17. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    нет я понимаю, что так надо, ну с другим файлом же работает а с этим нет, вот скачайте себе, плиз, проверьте , знатоки си.
    Посмотрите с этим фалом, плиз, прошу вас.
     
  18. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Рекомендую выкинуть нафиг древний DOSовский компилятор и поставить что-нибудь поновее.
    Файл для DOS-среды слишком большой - 512K. Общее количество доступной памяти в чистом DOS (я сейчас не рассматриваю примочки с EMS/XMS, это слишком продвинуто для этой темы) - 640K, из них сколько-то занимает сама система, так что выделить 512K могут просто не дать.
    Далее, в 16-битном режиме есть критическое значение 64K. Указатели бывают близкие и дальние (near/far). Близкие указатели позволяют адресовать только 64K, и для больших объёмов памяти нужны специальные ухищрения. Отсюда появляются разные модели памяти (tiny/small/medium/compact/large/huge), и нужно компилятору указать требуемую. В частности, обычный malloc может в принципе быть ограничен 64K (для моделей tiny/small/medium - точно ограничен) и не выделять больший объём никогда. Даже более того, аргумент malloc имеет тип size_t, который запросто может быть просто unsigned с максимальным значением 65535, и при передаче ей значения ровно 512*1024 это значение обрежется по модулю 65536, то есть до нуля.
    Так что тут есть варианты - либо malloc просто не поняла прикола и fread пытается читать в невыделенную память, либо malloc поняла прикол, но система офигела от запроса 512 килобайт в 16-битной программе.

    В обоих случаях переход на нормальный 32-битный компилятор решит проблему - приведённый код будет без проблем работать под тем же VC6 или gcc.
     
  19. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    1) Так мне можно оставить Ide от билдера а собирать другим компилем?
    2) Я специально создал файл размером 600 кило и всё нормально, но там только текстовые данные, а в этом бинарном коде, много управляющих символов, может дело в этом?
     
  20. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    1) Нет, 16-битное IDE вряд ли способно вызвать 32-битный компилер.
    2) Значит, malloc таки усекает по модулю 65536. Ровно 512*1024 превращается в 0, а 600 кило - в нормальное ненулевое число (если ровно 600*1024, то в 24576). Нет ничего страшного, если в память malloc(24576) читать 100 байт, а вот в malloc(0) явно не стоит.