Лично я совсем запутался: VS 2005, Борланд, Дос, "Загрузка файла с помощью malloc в память", а на самом деле нет. Мой мозг в ступоре.
Код (Text): #include <conio.h> #include <iostream> #include <stdio.h> int main() { using std::cout; // 1) ОТКРЫВАЕМ ФАЙЛ: FILE *in = fopen("test.txt", "rb"); // Если файл не открылся ... if (!in) { // ... сообщение об ошибке и завершение. cout << "\nCan't open file!\n\n\tPress any key for termination"; getch(); return 1; } // 2) ВЫЯСНЯЕМ РАЗМЕР ФАЙЛА В БАЙТАХ: // Устанавливаем указатель на конец файла, если при этом произошла ошибка ... if (fseek(in, 0, SEEK_END)) { cout << "\nCan't move file pointer!\n\n\tPress any key for termination"; getch(); return 1; } // Получаем числовое значение позиции конца файла, т.е. размер файла. long cb = ftell(in); // Если получено отрицательное значение ... if (cb < 0) { cout << "\nIncorrect file pointer!\n\n\tPress any key for termination"; getch(); return 1; } // Возвращаем указатель на начало файла. fseek(in, 0, SEEK_SET); // 3) ВЫДЕЛЯЕМ БУФЕР В ПАМЯТИ: char* buf; // Буфер для чтения файла. // Пробуем выделить буфер по размеру файла. try { buf = new char[cb]; } // Если выделить память не удалось ... catch (std::bad_alloc) { cout << "\nCan't allocate memory!\n\n\tPress any key for termination"; getch(); return 1; } // 4) ЧИТАЕМ ФАЙЛ В БУФЕР: size_t n = fread(buf, 1, (size_t)cb, in); // Если прочитали ноль байт ... if (!n) { cout << "\nFile is empty or error occured!\n\n\tPress any key for termination"; getch(); return 1; } // 4) ВЫВОДИМ СОДЕРЖИМОЕ БУФЕРА: for (unsigned i = 0; i < n; i++) cout << std::hex << buf[i]; getch(); return 0; } Правда без malloc, но тоже динамически. BCB6 и VS200x
Код (Text): size_t n = fread(buf, 1, (size_t)cb, in); // Если прочитали ноль байт ... if (!n) { cout << "\nFile is empty or error occured!\n\n\tPress any key for termination"; getch(); return 1; } я бы заменил примерно на: Код (Text): size_t n = fread(buf, 1, (size_t)cb, in); // Если прочитали кол-во байт не совпадающее с размером файла if (n != cb) { cout << "\nFile is empty or error occured!\n\n\tPress any key for termination"; getch(); return 1; }
Значит, так рассказываю. Я пытаюсь проэмулировать проц. 68000. Основной код проца уже написан. Я подумал - не пора ли открыть образ файла для проца. Когда начал работать с файлом для этого проца - у меня почему то выкидывает или показывает неправильные данные из файла, которые я считываю в буфер, к примеру когда я читаю первые 4 байта - всё ок, вижу те самые байти которые в файле, когда 100 байт- зависает, когда весь файл -выкидывает. Мне голову рвёт - как так может быть. Я специально создал файл размером 600 кило, чтоб больше образа, и прикиньте всё нормально, когда я весь файл читаю. Но там только печатные символы. А вот в самом роме много спец. и управляющих символов. Я ничего не понимаю. ОДНА ПОМОЩЬ НА ВАС. Собственно пишу на borland c++ 3.1, только использую ide для винды, там exe-ник в пакет входит. Скрин снят в студии. Студию не использую, так как всё равно пиши без Апи для переносимости в линукс. Вот. Да и ругается студия на старые функции, а я постоянно использую fopen. Помогите, каким нибудь макаром на чистом си накатать так, чтоб файл нормально загрузился в память и выдавал правильные данные. Чтоб при считывании любого байта из образа, он совпадал с байтом из файла. Спасибо. Жду с нетерпением ответом. Я даже специально с торрента качнул дистриб бордланда, думал мой какой-то битый чтоль
Ура товарищи, ура. Представляю вам плод своего творения. Я около 1,5 часа просидел в вин-хексе, режа файл покусочкам. В этоге дорезал до размера 118148. Скорее это всего имеет значение, может там какое -нить выравнивание. Можете сами проверить Вот прога и файл. Прибавьте 1 байт и ничего не появиться на экранеи вылетит, т.к. fread не срабатывает, кто это сможет объяснить? http://slil.ru/26215255 Код (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"); if (rom) cout << "done"; fseek(rom,0,SEEK_END); size=ftell(rom); fseek(rom,0,SEEK_SET); unsigned char *buf=(unsigned char*)malloc(size); if (fread(buf,1,size,rom)) printf("%x",buf[0]);; // cout <<hex<< buf[1] << '\n'; // printf("%x",buf[0]); // printf("\n%ld",size); /////////////// LD }
Не знаю какая реализация этого дела у Борланда или кого-то там. Но мысль о том, чтобы всё тщательно проверять хорошая. Скажи какой результат после выполнения функций. fopen, ftell, malloc, fread.
Говорит что функция старая. Если так делать Код (Text): long size1 =fread(buf,1,size,rom); if (size1==size) printf("1"); То 1-ка не выводиться, значит размеры не совпадают. А все остальное нормально работает
Да она устарела, новая fopen_s. Но всё равно же компилит. Веди лог, выводи значения на экран, так до посинения гадать можно. Конкретные цифры интересуют. fread возвращает сколько прочитала.
Я посмотрю сейчас. Меня интересует вот что, неужели только у меня не работает. Народ попробуйте. Исходник и файлы даны, порезанный который работает в проге и тот который не работает.
Ну тогда чего ты хочешь-то?))))))) про сегментную организацию памяти не забыл? Нельзя в досе использовать буферы размером больше 63К, если в документации к функции не указано ЯВНО что она работает с FAR-указателями и корректно обрабатывает выход за границу сегмента Если мне не изменяет память, то ни malloc, ни fread, ни fwrite к таким функциям не относятся
Конечно не понятно, зачем использовать borland c++ 3.1, это ж тихий ужас. Но у товарища 118148. Почему так, тоже не очень понятно.
Ну, короче, я так понял,что никто не может объяснить что происходит, и что делать. Может кто знает обёкт iostream посоветует как с файлом работать может там можно читать побайтово.
Ну короче, лично я не нанимался пересказывать то, что уже давным давно написано чуть-ли не на заборе.