У меня проблема:( пишу на С++ в MSVC 2008 )
//определяю размер файла f1
fseek( f1, 0, SEEK_END );
size1 = ftell( f1 );
fseek( f1, 0, SEEK_SET );
//создаю массив
char * arr_from_file_1 = new char[size1];
//загружаю содержимое файла в массив
fread( arr_from_file_1, size1, 1, f1 );
//обработка……….
//удаляю массив
delete [] arr_from_file_1;
Код компилируется і работает до удаления массива. Потом – сообщения об ошибке!
Может я чтото не верно делаю?
Ище, есть какая-то функция для определения размера файла?
27 июня 2008 в 0:02
мемset(arr_from_file_1,'\0',sizeof(char[size1])); — даже не знали, что функцыя есть.
Пересматрел код программы и обнаружил, что строки
arr_from_file_1[size1] = '\0';
вопше и не надо. Както механически написал, и ошыбка через єто.
Да, учитса надо ищё…
26 июня 2008 в 23:02
При наличии некоторой дисциплины обнулять совершенно не обязательно. Для новичков – может быть, и нормально.
26 июня 2008 в 23:00
Обычно хорошим тоном считается обнулить выделенный массив – мемset(arr_from_file_1,'\0',sizeof(char[size1]));
В принципе тоже самое, что добавление '\0' в конце, хотя и медленнее работает. Используется чаще, если читаем поток неизвестного размера, при этом естественно size1 должно быть как минимум на 1 больше прочитанных данных, если мы читаем строки. Но если чтение идет в бинарном коде, то сколько выделил, столько и прочитал – с таким массивом нельзя работать, как с обычной char строкой. В общем все зависит от целей программы при интерпретации содержимого файла.
26 июня 2008 в 21:05
Никто ничего не добавляет. Сколько скажешь, столько и будет прочитано.
26 июня 2008 в 21:04
>fread() же на конце '\0' возвращает?
Может я не очени хорошо знаю С++, но fread() используют для по-блокового чтения в бинарном режиме открытия файла, и у меня если '\0' на поставить, то виводит ищё какой-то бред в конце…
26 июня 2008 в 21:03
Чтобы было портабельно – нет, нельзя.
26 июня 2008 в 21:03
fread() же на конце '\0' возвращает? Ну тогда да, size1 + 1.
26 июня 2008 в 21:02
! Работает !
Спасибо.
А размер файла можна коким-то другим способ определить?
26 июня 2008 в 21:01
Покажи строчку, где файл открывается.
26 июня 2008 в 21:01
Ошибка исчезает если убрать чтение с файла
fread( arr_from_file_1, size1, 1, f1 );
arr_from_file_1[size1] = '\0';// <- из за етого ошибка
26 июня 2008 в 21:01
кажетса, надо arr_from_file_1[size1-1] = '\0'.
26 июня 2008 в 21:01
в исходнике этого не было)
надо new char[size1 + 1]
26 июня 2008 в 21:00
Роман 'Gem' Воробец, там код програмы, не буду усьо писать здесь.
//а может и надо….
26 июня 2008 в 21:00
Я имею в виду, временно закомментировать в программе. Очень простой метод поиска ошибки.
26 июня 2008 в 21:00
Идея! Но ошибка не исчезла…
26 июня 2008 в 20:05
Там обработка массива, точнее сравнение с другим массивом
26 июня 2008 в 20:05
Сообщение об ошибке выглядит как "сообщение об ошибке" или там что-то более конкретное? Типа "segmentation fault".
26 июня 2008 в 20:05
Попробуй закомментировать "точечки"…
26 июня 2008 в 20:05
Debug error!
Heap corruption detected: after Normal block (#54) at 0×014e0040
CRT detected thet the application wrote to memory after end of heap buffer.
26 июня 2008 в 20:04
С ходу – всё правильно.
А что вместо точечек-то?