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

Работа с файлами(получение информации о файлах, которые будут архивироватся)

10.04.2016, 21:45. Просмотров 272. Ответов 3
Метки нет (Все метки)

Функция записывает в текстовый файл общий размер информационного блока||размер 1файла||имя файла||размер 2 файла и т.д.
Пытаюсь найти ошибку в коде-пользуюсь отладчиком. Программа вылетает при попытке освободить память delete [] m_size; Почему так?
Пробую закоментить эту строчку. Тогда все отрабатывает, но в текстовом файле "info. txt" всегда неверен размер второго файла. Все остальные значения по отладчику верны и функция отрабатывает правильно.
Может у кого есть какие мысли:
1. Что не так при освобождении массива char.
2. Почему неверное значение вылетает только при втором файле.
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
void Package::getInfo()//получение информации о всех файлах и сохранение в промежуточный текстовый файл 
{
    char byte[1];  // единичный буфер для считывания одного байта
 
    basic_string<char> s_info = "";
    remove((this->path+"info.txt").c_str());  // на всякий случай
    FILE *info = fopen((this->path+"info.txt").c_str(),"a+");  // сохраняем информацию в наш текстовый файл
    int bytes_size=0;  // длина информационного блока в байтах
    for(vector<string>::iterator itr=this->files.begin();itr!=this->files.end();++itr)
    {
        FILE *f = fopen((*itr).c_str(),"rb");
        if(!f) break;
        // получаем размер архивируемого файла
        fseek(f,0,SEEK_END);
        int size = ftell(f);  
        
        string name = Package::get_file_name(*itr);  // получаем имя архивируемого файла
 
        char *m_size = new char[digs(size)];
        itoa(size,m_size,10);//char *itoa( int value, char * string, int radix );
        fclose(f);
 
        bytes_size+=digs(size);//digs()-считает разряды
        bytes_size+=strlen(name.c_str());
 
        // все, что "нарыли", сохраняем в промежуточный буфер :
        s_info.append(m_size);
        s_info.append("||");
        s_info.append(name);
        s_info.append("||");
 
        
        //delete [] m_size;
 
    }
    bytes_size = s_info.size()+2;
    char *b_buff = new char[digs(bytes_size)];
    itoa(bytes_size,b_buff,10);
 
    // форматируем до 5 байт
    if(digs(bytes_size)<5) fputs(string(5-digs(bytes_size),'0').c_str(),info);
 
    fputs(b_buff,info);
    fputs("||",info);
    fputs(s_info.c_str(),info);
 
    fclose(info);
}
Код не мой. Не могу понять зачем мы считаем bytes_size в цикле, чтобы потом присвоить ему новое значение. Новое значение отражает размер информационного блока и всегда дает верное значение. Почему bytes_size = s_info.size()+2; ? Почему прибавляем 2?

Добавлено через 3 минуты
код брала отсюда https://github.com/AsenOsen/Zipper/blob/master/zipper.cpp

Добавлено через 56 секунд

Добавлено через 26 минут
Со вторым вопросом разобралась-проблема была в текстовом файле. Ошибка с памятью все еще актуальна.

Добавлено через 54 минуты
разобралась
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2016, 21:45
Ответы с готовыми решениями:

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

Получение информации о файлах в заданной папке
Написать программу, которая прочитает информацию о файлах Ваших программ в Вашей папке: имя...

Получение информации о бинарности (x64 - x32) dll или exe файлах
Добрых день. Появилась необходимость получения информации о разрядности dll или exe файлах (или...

Получение коллекций из элементов коллекции, которые будут объединены по какому-то свойству
Здравствуйте. Подскажите новичку. Есть коллекция элементов с определенными свойствами. Как можно...

Из информации, содержащейся в файлах query., определить названия товаров, которые не были в продаже в 1990 г
Из информации, содержащейся в файлах query..., определить названия товаров, которые не были в...

3
nmcf
6532 / 5756 / 2621
Регистрация: 14.04.2014
Сообщений: 24,492
10.04.2016, 22:05 2
И что там было?
0
lenarano
2 / 2 / 2
Регистрация: 12.04.2014
Сообщений: 102
11.04.2016, 08:41  [ТС] 3
выходила за пределы массива.
C++
1
char *m_size = new char[digs(size)+1];
0
nmcf
6532 / 5756 / 2621
Регистрация: 14.04.2014
Сообщений: 24,492
11.04.2016, 09:15 4
Зачем вообще считать разряды и динамически выделять память на каждой итерации? Возьми m_size[50] или сделай всё на string, чтобы не думать про размеры.
Вот это непонятная строка:
C++
1
basic_string<char>
Почему не string?
0
11.04.2016, 09:15
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2016, 09:15

Какие есть способы для получение информации из таблиц, которые не связаны с формой?
какие есть способы для получение информации, таблицы которые не связан с формой... Пакажитэ...

Работа с файлами. Поиск и сбор информации
Здравствуйте) Мои навыки программирования целиком и полностью основываются на этом форуме)...

Работа с файлами. Обработка текстовой информации
Необходимо написать программу, которая выполняет указанные операции (каждую операцию оформить...


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

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

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