Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
gvozdik
4 / 4 / 2
Регистрация: 09.12.2014
Сообщений: 38
#1

Чтение бинарного файла с 16-ричными числами в массив - предоставление и очищение памяти - C++

15.12.2014, 09:43. Просмотров 312. Ответов 4
Метки нет (Все метки)

Программа вылетает, переполнение стека..
Имеется бинарный файл с 16-ричными числами, по 40 штук в строке вида "4d" через пробел. Пытаюсь их считать в массив, каждый элемент которого будет содержать числа одной строки. Строк в файле, например, 26.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "stdafx.h"
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <cmath>
#include <fstream>
#include <iostream>
 
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    
                uint8_t *mass[26];
                FILE* fp=fopen ("Z.bit", "rb");
            for (int i=0; i<26; i++){
             memset(mass[i],0, 40);
             mass[i] = new uint8_t[40];
             fread(mass[i], 1,40, fp);
 
             //printf("%x\n", mass[i][0]);
             }
    
    
    system ("pause");
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2014, 09:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Чтение бинарного файла с 16-ричными числами в массив - предоставление и очищение памяти (C++):

Чтение структуры из бинарного файла в массив
Структура выглядит так: struct StandardBook { char...

Очищение памяти (одномерный динамический массив)
Здравствуйте, у меня возникла проблема с высвобождением памяти при одномерном...

Работа с 16-ричными числами
Написать программу, которая вводит с клавиатуры натуральное число N, выполняет...

Перегрузка операций над 16-ричными числами
Базовый класс «Шестнадцатеричное число»: - конструкторы (по умолчанию,...

Забиваем строку 16-ричными числами и выводим на экран (генерируем МАС)
генерируется мак адрес и выводится на экран. но вот только как то не корректно...

Забить char-строку 16-ричными числами из генератора случайных чисел
чет не могу понять как? есть буфер char packetbuff; его нужно забить из...

4
Kerry_Jr
Эксперт PHP
2210 / 2006 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
15.12.2014, 09:53 #2
Цитата Сообщение от gvozdik Посмотреть сообщение
C++
1
2
memset(mass[i],0, 40);
mass[i] = new uint8_t[40];
сначала заполняете, а потом память выделяете? Попробуйте строки местами поменять. И не забывайте динамически выделенную память освобождать.
1
gvozdik
4 / 4 / 2
Регистрация: 09.12.2014
Сообщений: 38
15.12.2014, 09:59  [ТС] #3
спасибо большое за ответ. создав тему, сразу бросились в глаза переставленные строки и исправила. перестановка их помогла. ищу, как тут удалить тему.. не подскажете?
и про память можно динамическую тоже рассказать)
как очищать

и еще такая проблема.. строк в файле куда больше чем 26... а именно uint8_t *mass[262144]; мне надо.. но при такой цифре вновь вылетает прога. может дело как раз в освобождении памяти, не подскажете?
0
Kerry_Jr
Эксперт PHP
2210 / 2006 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
15.12.2014, 10:14 #4
Лучший ответ Сообщение было отмечено gvozdik как решение

Решение

Цитата Сообщение от gvozdik Посмотреть сообщение
как очищать
если используете оператор new (new[]), всегда используйте его в связке с delete(delete[]). Т.е. выделили нужный кусок памяти, например,
C++
1
char* str = new char[20];
Попользовались им, после этого
C++
1
delete[] str;
Если в цикле выделили несколько кусков памяти, например,
C++
1
2
3
uint8_t *mass[26];
for (int i = 0; i < 26; ++i)
    mass[i] = new uint8_t[40];
то и удалять нужно в цикле
C++
1
2
for (int i = 0; i < 26; ++i)
    delete[] mass[i];
Про динамическое выделение и последующее освобождение памяти лучше почитать в каком-нибудь источнике, т.к. тема довольно-таки обширная.

Добавлено через 2 минуты
Цитата Сообщение от gvozdik Посмотреть сообщение
uint8_t *mass[262144];
А зачем Вам такой большой массив сразу. Может проще будет сделать обработку каждой строки в цикле?
1
gvozdik
4 / 4 / 2
Регистрация: 09.12.2014
Сообщений: 38
15.12.2014, 10:24  [ТС] #5
обработка по строкам не спасет. мне надо хранить часть каждой строки. понизила свою нужду до 65536 и не вылетает!
Спасибо Вам большое за ответы!
0
15.12.2014, 10:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2014, 10:24
Привет! Вот еще темы с решениями:

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется
Формат файла состоит из 3 структур и одной переменной. Подробное описание...

Чтение из бинарного файла
Добрый вечер.Возникла проблема при чтении имени объекта из бинарного...

Чтение бинарного файла
Здравствуйте. Есть код чтения бинарного файла: FILE *f; string tmp; char...

Чтение из бинарного файла
Ну собственно,у меня есть некий двоичный файл,в него записана моя информация в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru