Привет!!! Народ, подскажите, как считать файл в память которая выделяется для файла динамически функцией. Ведь файл бывает у меня разного размера. А то, когда я указываю точный размер буффера - то всё нормально, а если через malloc, то выкидывает. Приведите пример плиз. И как обращаться потом к данным внутри буфера, т.е. уже к образу файла побайтово? Спасибо.
Код (Text): char* pBuff = malloc(size); if (pBuff) { fread(hFile, 1, size, pBuff); char simb = *pBuff [size-1];
Код (Text): char simb = *pBuff [size-1]; А это зачем, не пойму, Ну я так почти и делаю, выкидывает только, не пойму почему.
Код (Text): char simb = pBuff [size-1]; Ну это типо обращение к последнему элементу массива. * не надо
А почему здесь на 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 }
Странные вещи делаешь: ftell(rom); - что такое rom? Где выделение памяти под buf? В конце не помешало-бы fclose
Нет, указатель это штука которая указывает на область памяти, а эту область памяти надо ещё иметь. buf = (unsigned char*)malloc(size);
А почему у меня всё равно правильное значение выводиться, а потом выкидывает это из-за того что нету конца строки?
У меня виснет теперь, что за на Borland c++visual Вот так напрочь подвисает когда ставлю развер 100, когда 4 байта читает в буфер, всё прокатывает, а когда 100 виснет напрочь. Посмотрите плиз Ругается на ntvdm.exe какой то вот код Код (Text): #include <stdio.h> #include <iostream.h> #include <stdlib.h> void main() { FILE *rom; long size; // unsigned char buf[20]; rom=fopen("c:\\1.txt","rb"); fseek(rom,0,SEEK_END); size=ftell(rom); fseek(rom,0,SEEK_SET); unsigned char *buf=(unsigned char*)malloc(size); fread(buf,1,100,rom); // здесь 100 и 4 копирую // cout <<hex<< buf[0] << '\n'; printf("%x",buf[0]); // printf("\n%ld",size); /////////////// LD } Ха... Народ. Я вообще ничего не понимаю . Все эти ошибки происходят почему то с этим файлом , на остальном -всё нормально, загрузите , проверьте -сами убедитесь http://slil.ru/26211615
1. fopen/malloc/fread все возвращают флаг успешности. ты не удосуживаешь себя проверять то, успешно или нет эти ф-ции отработали. я тебе в посте выше про это уже говорил 2. fread(buf,1,100,rom); // здесь 100 и 4 копирую что это такое? ты говоришь прочесть из открытого файла в буффер 1 элемент, размер которого равен 100. а нахрена тогда заморачивалса выше и выделял буффер динамически исключительно равный размеру файла? короче надо так: Код (Text): long result = fread(buf, 1, size, rom); if (result != size) {fputs ("Reading error",stderr); return 1;} 3. а кто за тебя fclose(rom); делать будет? 4. а кто за тебя будет освобождать выделенный кусок памяти: free(buf); ?? ps: язык Си требует к себе уважения и хорошего понимания. каждый свой "шаг" нужно(желательно) контролировать.
нет я понимаю, что так надо, ну с другим файлом же работает а с этим нет, вот скачайте себе, плиз, проверьте , знатоки си. Ну а если я размер файла в функции read поставлю, у меня система намерто зависает, а когда 100 , не так сильно.
нет я понимаю, что так надо, ну с другим файлом же работает а с этим нет, вот скачайте себе, плиз, проверьте , знатоки си. Посмотрите с этим фалом, плиз, прошу вас.
Рекомендую выкинуть нафиг древний 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.
1) Так мне можно оставить Ide от билдера а собирать другим компилем? 2) Я специально создал файл размером 600 кило и всё нормально, но там только текстовые данные, а в этом бинарном коде, много управляющих символов, может дело в этом?
1) Нет, 16-битное IDE вряд ли способно вызвать 32-битный компилер. 2) Значит, malloc таки усекает по модулю 65536. Ровно 512*1024 превращается в 0, а 600 кило - в нормальное ненулевое число (если ровно 600*1024, то в 24576). Нет ничего страшного, если в память malloc(24576) читать 100 байт, а вот в malloc(0) явно не стоит.