Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 08.10.2018
Сообщений: 2

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

24.12.2019, 18:15. Показов 4056. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.12.2019, 18:15
Ответы с готовыми решениями:

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

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от zayats80888 Посмотреть сообщение
Я правильно понял, вы адреса связей при записи в файл меняете на позиции "курсора"? Тогда вопрос, а как интерпретируются nullptr? И вообще, к чему такие заморочки? Почему просто не записывать хранимые списком данные по порядку, без связей?
Я после этого действия еще должен работать с этим списком.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
24.12.2019, 19:12
У меня сейчас башка не варит, что бы разбираться в твоей мозгодробилке. Но по поводу
Цитата Сообщение от LesChesterfield Посмотреть сообщение
Если я, например, удаляю какой-то элемент
скажу следующее: удалить из файла нельзя, т.е. его размер не уменьшить, однако после удаления можно сделать так, что добавление элемента этот размер не увеличит. Нужно лишь хранить в файле(где нибудь вначале) действительное количество элементов списка. Удаляя элемент, помимо перенацеливания указателей, нужно свапнуть удаленный и последний(в файле) действительный элемент списка, уменьшить счетчик(размер списка). Тогда при последующем добавлении можно, ориентируясь на хранимый действительный размер списка, просто записать поверх "удаленного". Я бы так сделал.
0
0 / 0 / 0
Регистрация: 14.10.2020
Сообщений: 2
06.12.2020, 11:07
LesChesterfield, отпишись пожалуйста, если у тебя получилось устранить проблему в работе программы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.12.2020, 11:07
Помогаю со студенческими работами здесь

Запись в бинарный файл
Всем привет. Подскажите пожалста как через fstream добавить запись в бинарный файл ? нужно добавить именно В НАЧАЛО , не очищая...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru