0 / 0 / 0
Регистрация: 08.10.2018
Сообщений: 2
1

Запись в бинарный файл

24.12.2019, 18:15. Показов 3242. Ответов 4
Метки нет (Все метки)

Делаю курсовую работу. Шаблонный класс, выполняющий функции двоичного файла, хранящего в себе двусвязный список объектов. Все работает кроме балансировки бинарного файла(удаления мусора). Если я, например, удаляю какой-то элемент, то просто перекидываю файловые указатели у соседних элементов друг на друга, тем самым обходя удаляемый элемент. Но ведь удаляемый элемент остался в памяти, его нужно удалить. И вот я сделал такой метод, он будет ниже. В приложениях к теме скриншоты бинарных файлов. list.bin до сортировки, he.bin после.

Помогите, пожалуйста, откуда берутся 3 нулевых элемента после сжатия?
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
49
50
51
52
53
54
55
56
template <class T> void BinFile<T>::balance()
{
    int nhead = -1, nend = -1;
    //ofstream f("he.bin", ios::binary | ios::out);
    BinFile <T> f("he.bin");
    seekp(sizeof(int));
    int begin;
    read(reinterpret_cast<char*>(&begin), sizeof(int));
    seekp(begin);
    int i = begin;
    while (i != 0)
    {
        seekp(i);
        int next;
        read(reinterpret_cast<char*>(&next), sizeof(int));
        seekp(i + sizeof(int));
        T ttmp;
        read(reinterpret_cast<char*>(&ttmp), sizeof(T));
 
        //-----------------------
        if (nhead == -1) // Если добавляемый элемент первый
        {
            int phead = 2 * sizeof(int); // создание указателей на начало и конец, равные 2*sizeof(T), указывающие на единственный элемент в списке
            int pend = 2 * sizeof(int);
            f.seekp(0, ios::end); // Перенос указателя на конец файла
            f.write(reinterpret_cast<char*>(&pend), sizeof(int)); // запись указателя на конец
            f.write(reinterpret_cast<char*>(&phead), sizeof(int)); // ... на начало
            f.seekp(2 * sizeof(int)); // Перенос указателя записи на позицию head.
            nhead = phead;
            nend = nhead;
            phead = 0;
            int prev = 0;
            f.write(reinterpret_cast<char*>(&phead), sizeof(int)); // Указатель на следующий, равный нулю
            f.write(reinterpret_cast<char*>(&ttmp), sizeof(T)); // объект
            f.write(reinterpret_cast<char*>(&prev), sizeof(int)); // Указатель на предыдущий, равный нулю
        }
        else // Если добавляемый элемент не первый
        {
            f.seekp(0, ios::end);
            int pnew = tellp(); // запись в pnew указателя на текущую позицию позицию записи
            f.seekp(nend); // перенос указателя на последний элемент
            f.write(reinterpret_cast<char*>(&pnew), sizeof(int)); // Перезапись указателя предыдущего элемент на следующий, равный текущему
            f.seekp(pnew); // Перенос указателя на позицию pnew(конец файла)
            int prev = nend; // Prev равен предыдущему последнему элементу
            nend = pnew; // Теперь последний элемент - новый
            pnew = 0;
            f.write(reinterpret_cast<char*>(&pnew), sizeof(int)); // Указатель на следующий у текущего равен нулю
            f.write(reinterpret_cast<char*>(&ttmp), sizeof(T)); // объект
            f.write(reinterpret_cast<char*>(&prev), sizeof(int)); // Указатель на предыдущий равный прежнему end
            f.seekp(0); // Перенос указателя на 0 байт (начало файла)
            f.write(reinterpret_cast<char*>(&nend), sizeof(int)); // Перезапись указателя на последний элемент в начале файла
        }
        i = next;
        }
    f.close();
    }
Миниатюры
Запись в бинарный файл   Запись в бинарный файл  
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.12.2019, 18:15
Ответы с готовыми решениями:

Запись в бинарный файл
Всем привет. Столкнулся с следующей проблемой при написании курсача,а именно с записью в бинарный в...

Запись в бинарный файл
По заданию требуется организовать ввод данных типа структуры в бинарных файл , в соответствии с...

Запись в бинарный файл
Помогите приделает функцию что бы она записывала не в обычный файл а в бинарный, уже три чеса сижу...

Запись в бинарный файл
Всем привет. Подскажите пожалста как через fstream добавить запись в бинарный файл ? нужно...

4
5548 / 3030 / 1265
Регистрация: 07.02.2019
Сообщений: 7,654
24.12.2019, 18:24 2
Я правильно понял, вы адреса связей при записи в файл меняете на позиции "курсора"? Тогда вопрос, а как интерпретируются nullptr? И вообще, к чему такие заморочки? Почему просто не записывать хранимые списком данные по порядку, без связей?
0
0 / 0 / 0
Регистрация: 08.10.2018
Сообщений: 2
24.12.2019, 18:37  [ТС] 3
Жвусвязный список объектов, каждый из них связан с другими с помощью файловых указателей.

Добавлено через 1 минуту
Цитата Сообщение от zayats80888 Посмотреть сообщение
Я правильно понял, вы адреса связей при записи в файл меняете на позиции "курсора"? Тогда вопрос, а как интерпретируются nullptr? И вообще, к чему такие заморочки? Почему просто не записывать хранимые списком данные по порядку, без связей?
Я после этого действия еще должен работать с этим списком.
0
5548 / 3030 / 1265
Регистрация: 07.02.2019
Сообщений: 7,654
24.12.2019, 19:12 4
У меня сейчас башка не варит, что бы разбираться в твоей мозгодробилке. Но по поводу
Цитата Сообщение от LesChesterfield Посмотреть сообщение
Если я, например, удаляю какой-то элемент
скажу следующее: удалить из файла нельзя, т.е. его размер не уменьшить, однако после удаления можно сделать так, что добавление элемента этот размер не увеличит. Нужно лишь хранить в файле(где нибудь вначале) действительное количество элементов списка. Удаляя элемент, помимо перенацеливания указателей, нужно свапнуть удаленный и последний(в файле) действительный элемент списка, уменьшить счетчик(размер списка). Тогда при последующем добавлении можно, ориентируясь на хранимый действительный размер списка, просто записать поверх "удаленного". Я бы так сделал.
0
0 / 0 / 0
Регистрация: 14.10.2020
Сообщений: 2
06.12.2020, 11:07 5
LesChesterfield, отпишись пожалуйста, если у тебя получилось устранить проблему в работе программы
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2020, 11:07
Помогаю со студенческими работами здесь

Запись в бинарный файл
Вот функция добавления данных: void addConstellations() { system(&quot;CLS&quot;); int n; wcout &lt;&lt;...

Запись в бинарный файл
Подскажите пожалуйста,где в коде ошибка??никак найти не могу почему х не считает. В файл...

Запись в бинарный файл
Скажите пожалуйста, правильно ли работает моя программа? (Имеется ввиду запись в бинарный файл) ...

Запись в бинарный файл
Подскажите как записать данные из StringGrid в бинарный файл и компоновка допустим из 2 StringGrid ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru