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

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

  1. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Минуточку, картинка на посте #7 явно указывает на наличие VS2005. Почему бы ей не пользоваться?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Лично я совсем запутался: VS 2005, Борланд, Дос, "Загрузка файла с помощью malloc в память", а на самом деле нет. Мой мозг в ступоре.
     
  3. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Мой тоже кипит. Ща всё расскажу
     
  4. bigredcat

    bigredcat New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    54
    Код (Text):
    1. #include <conio.h>
    2. #include <iostream>
    3. #include <stdio.h>
    4.  
    5. int main()
    6. {
    7.     using std::cout;
    8.  
    9.     // 1) ОТКРЫВАЕМ ФАЙЛ:
    10.     FILE *in = fopen("test.txt", "rb");
    11.     // Если файл не открылся ...
    12.     if (!in)
    13.     {
    14.         // ... сообщение об ошибке и завершение.
    15.         cout << "\nCan't open file!\n\n\tPress any key for termination";
    16.         getch();
    17.         return 1;
    18.     }
    19.  
    20.     // 2) ВЫЯСНЯЕМ РАЗМЕР ФАЙЛА В БАЙТАХ:
    21.     // Устанавливаем указатель на конец файла, если при этом произошла ошибка ...
    22.     if (fseek(in, 0, SEEK_END))
    23.     {
    24.         cout << "\nCan't move file pointer!\n\n\tPress any key for termination";
    25.         getch();
    26.         return 1;
    27.     }
    28.     // Получаем числовое значение позиции конца файла, т.е. размер файла.
    29.     long cb = ftell(in);
    30.     // Если получено отрицательное значение ...
    31.     if (cb < 0)
    32.     {
    33.         cout << "\nIncorrect file pointer!\n\n\tPress any key for termination";
    34.         getch();
    35.         return 1;
    36.     }
    37.     // Возвращаем указатель на начало файла.
    38.     fseek(in, 0, SEEK_SET);
    39.  
    40.     // 3) ВЫДЕЛЯЕМ БУФЕР В ПАМЯТИ:
    41.     char* buf; // Буфер для чтения файла.
    42.     // Пробуем выделить буфер по размеру файла.
    43.     try
    44.     {
    45.         buf = new char[cb];
    46.     }
    47.     // Если выделить память не удалось ...
    48.     catch (std::bad_alloc)
    49.     {
    50.         cout << "\nCan't allocate memory!\n\n\tPress any key for termination";
    51.         getch();
    52.         return 1;
    53.     }
    54.  
    55.     // 4) ЧИТАЕМ ФАЙЛ В БУФЕР:
    56.     size_t n = fread(buf, 1, (size_t)cb, in);
    57.     // Если прочитали ноль байт ...
    58.     if (!n)
    59.     {
    60.         cout << "\nFile is empty or error occured!\n\n\tPress any key for termination";
    61.         getch();
    62.         return 1;
    63.     }
    64.  
    65.     // 4) ВЫВОДИМ СОДЕРЖИМОЕ БУФЕРА:
    66.     for (unsigned i = 0; i < n; i++)
    67.         cout << std::hex << buf[i];
    68.  
    69.     getch();
    70.     return 0;
    71. }
    Правда без malloc, но тоже динамически. BCB6 и VS200x
     
  5. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Код (Text):
    1. size_t n = fread(buf, 1, (size_t)cb, in);
    2.     // Если прочитали ноль байт ...
    3.     if (!n)
    4.     {
    5.         cout << "\nFile is empty or error occured!\n\n\tPress any key for termination";
    6.         getch();
    7.         return 1;
    8.     }
    я бы заменил примерно на:
    Код (Text):
    1. size_t n = fread(buf, 1, (size_t)cb, in);
    2.     // Если прочитали кол-во байт не совпадающее с размером файла
    3.     if (n != cb)
    4.     {
    5.         cout << "\nFile is empty or error occured!\n\n\tPress any key for termination";
    6.         getch();
    7.         return 1;
    8.     }
     
  6. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Значит, так рассказываю. Я пытаюсь проэмулировать проц. 68000. Основной код проца уже написан. Я подумал - не пора ли открыть образ файла для проца. Когда начал работать с файлом для этого проца - у меня почему то выкидывает или показывает неправильные данные из файла, которые я считываю в буфер, к примеру когда я читаю первые 4 байта - всё ок, вижу те самые байти которые в файле, когда 100 байт- зависает, когда весь файл -выкидывает. Мне голову рвёт - как так может быть. Я специально создал файл размером 600 кило, чтоб больше образа, и прикиньте всё нормально, когда я весь файл читаю. Но там только печатные символы. А вот в самом роме много спец. и управляющих символов. Я ничего не понимаю. ОДНА ПОМОЩЬ НА ВАС. Собственно пишу на borland c++ 3.1, только использую ide для винды, там exe-ник в пакет входит. Скрин снят в студии. Студию не использую, так как всё равно пиши без Апи для переносимости в линукс. Вот. Да и ругается студия на старые функции, а я постоянно использую fopen. Помогите, каким нибудь макаром на чистом си накатать так, чтоб файл нормально загрузился в память и выдавал правильные данные. Чтоб при считывании любого байта из образа, он совпадал с байтом из файла.
    Спасибо. Жду с нетерпением ответом. Я даже специально с торрента качнул дистриб бордланда, думал мой какой-то битый чтоль :dntknw:
     
  7. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Ура товарищи, ура. Представляю вам плод своего творения. Я около 1,5 часа просидел в вин-хексе, режа файл покусочкам. В этоге дорезал до размера 118148. Скорее это всего имеет значение, может там какое -нить выравнивание. Можете сами проверить
    Вот прога и файл. Прибавьте 1 байт и ничего не появиться на экранеи вылетит, т.к. fread не срабатывает, кто это сможет объяснить?

    http://slil.ru/26215255

    Код (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.  rom=fopen("c:\\1.txt","rb");
    10.  if (rom) cout  << "done";
    11.  fseek(rom,0,SEEK_END);
    12.  size=ftell(rom);
    13.  fseek(rom,0,SEEK_SET);
    14.  unsigned char *buf=(unsigned char*)malloc(size);
    15.  if (fread(buf,1,size,rom))  printf("%x",buf[0]);;
    16. // cout <<hex<< buf[1] << '\n';
    17. // printf("%x",buf[0]);
    18. // printf("\n%ld",size);  /////////////// LD
    19. }
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Не знаю какая реализация этого дела у Борланда или кого-то там. Но мысль о том, чтобы всё тщательно проверять хорошая. Скажи какой результат после выполнения функций.
    fopen, ftell, malloc, fread.
     
  9. varnie

    varnie New Member

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

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    И с какого перепугу студия ругается на fopen?
     
  11. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Говорит что функция старая.
    Если так делать
    Код (Text):
    1. long size1 =fread(buf,1,size,rom);
    2. if (size1==size) printf("1");
    То 1-ка не выводиться, значит размеры не совпадают.
    А все остальное нормально работает
     
  12. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Всё дело в размерах файла
    и ф функции fread. Никакой другой тама нету чтоб в буфер считать
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Да она устарела, новая fopen_s. Но всё равно же компилит.

    Веди лог, выводи значения на экран, так до посинения гадать можно.
    Конкретные цифры интересуют. fread возвращает сколько прочитала.
     
  14. ajak

    ajak New Member

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

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Ээээ под ДОС что ли?
     
  16. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Ога
     
  17. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Ну тогда чего ты хочешь-то?)))))))
    про сегментную организацию памяти не забыл?
    Нельзя в досе использовать буферы размером больше 63К, если в документации к функции не указано ЯВНО что она работает с FAR-указателями и корректно обрабатывает выход за границу сегмента
    Если мне не изменяет память, то ни malloc, ни fread, ни fwrite к таким функциям не относятся
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Конечно не понятно, зачем использовать borland c++ 3.1, это ж тихий ужас.
    Но у товарища 118148. Почему так, тоже не очень понятно.
     
  19. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Ну, короче, я так понял,что никто не может объяснить что происходит, и что делать. Может кто знает обёкт iostream посоветует как с файлом работать может там можно читать побайтово.
     
  20. Booster

    Booster New Member

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