Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
9 / 9 / 8
Регистрация: 02.01.2017
Сообщений: 262
1

Удалить запись в бинарном файле

31.01.2017, 16:05. Показов 1289. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго временни суток, пишу функции записи/чтения. В приложении есть массив очень сложных объектов класса с множеством структур и векторов классов с полями типа string,время на запись и чтение соответственно растет в математической прогрессии и не столько на запись сколько на структурирование записи и приведении её к типу char*.С чтением проблема решена(в заголовке каждой записи есть порядковый номер первого байта,размер записи и необходимое описние для вывода в список, полностью открывается только один объект класса выбранный юзером),с записью нового объекта ещё проще-дозапись в конец файла. А вот с удалением возникли трудности, зная адрес и длинну записи можно не тратить ресурс пк на подготовку к записи а попросту открыть в массив char* вырезать ненужное и сохранить.Написал функцию, но она не работает.
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
bool delbinfile(char* filename,int _beg,int _end)
 //_beg первый байт удаляемого отрезка
 //_end последний байт удаляемого отрезка
 {
 int last;
 ifstream ifile;
 ifile.open(filename,ios::binary|ios::in|ios::app);
 last=ifile.tellg();
 char* first=new char[_beg];
 char* second=new char[last-_end];
 char* all=new char[_beg+(last-_end)];
 ifile.seekg(0);
 ifile.read(first,_beg);
 ifile.seekg(_end+1);
 ifile.read(second,(last-_end));
 all=strcat(first,second);
 ifile.close();
 delete first;
 delete second;
 ofstream ofile;
 ofile.open(filename,ios::binary|ios::trunc);
 ofile.write(all,strlen(all));
 ofile.close();
 delete all;
 }
Скорее всего strcat криво делает конкатенацию, кто сталкивался подскажите как соединить строки без потери данных, и без добавления нуль символа? да и strlen может обрезать строку если в конце будут нули...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.01.2017, 16:05
Ответы с готовыми решениями:

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

Как в бинарном файле (.dat) удалять и редактировать выбранную запись
Подскажите как в бинарном файле(.dat) удалять и редактировать выбранную запись(case 5 и case 6): ...

Удалить строку в бинарном файле
Подскажите, пожалуйста, как удалить определенную строку из бинарного файла (.bin)? дельфи.

Запись\считывание матрицы в бинарном файле
Доброго времени суток. Необходимо что бы в бинарный файл было записанно- размер матрицы(кол-во...

6
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
31.01.2017, 22:49 2
1) Функция strcat работает только с null-terminated строками. Используйте memcpy:
C++
1
2
memcpy(all, first, _beg);
memcpy(all+_beg, second, last-_end);
2) Массивы удаляются так: delete[] first.
1
9 / 9 / 8
Регистрация: 02.01.2017
Сообщений: 262
01.02.2017, 11:29  [ТС] 3
Спасибо,нашел ещё memmove,но мой подход оказался неверным если записывать в заголовке каждой записи ее адрес и размер, то после первого удаления позиция записи смещается а адрес не перезаписывается....

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

Добавлено через 2 минуты
Так не хотел связываться с базами данных, может есть какие-то готовые решения или библиотеки для таких случаев....
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.02.2017, 11:42 4
Цитата Сообщение от imjonhson Посмотреть сообщение
может есть какие-то готовые решения или библиотеки для таких случаев....
boost.serialization
cereal
0
9 / 9 / 8
Регистрация: 02.01.2017
Сообщений: 262
02.02.2017, 02:23  [ТС] 5
пару моментов если не затруднит
Когда-то пытался покопать в этом направлении, но столкнулся с отсутствием доступного описания, не подскажете ресурс если такой есть.
boost быстрее того-же SQL или чего-то из арсенала билдера(6-й).
boost ,бесплатный даже для коммерческого использования?

Добавлено через 13 часов 35 минут
Цитата Сообщение от Avazart Посмотреть сообщение
Хотите новой буст ставьте XE3 и обязательно в системе x64.
Установка boost
Boost для счастливых владельцев XE3, у меня пока нет возможности потратить 1500$ на XE3 зато есть когда-то купленный builder6.
И небольшое резюме исходя из того что я нашел в сети про boost
Если раньше не сталкивался с бустом и нет необходимости в использовании буста в промышленных масштабах для ситуаци вроде моей проще налепить костыли, чтение документации поиски статей на родном языке займут время плюс ко всему boost не .h файл которому достаточно сделать #include а требует сборки библиотек и т.д. что требует определенного уровня подготовки(не считая описанных вариантов под visual).
Единственный плюс boost.serialization это более высокая скорость сборки и распаковки архива.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.02.2017, 11:18 6
Цитата Сообщение от imjonhson Посмотреть сообщение
не подскажете ресурс если такой есть.
http://g.zeos.in/?q=boost.serialization&m=1
Цитата Сообщение от imjonhson Посмотреть сообщение
boost быстрее того-же SQL
SQL к вашей ситуации не имеет ни малейшего отношения.
Цитата Сообщение от imjonhson Посмотреть сообщение
или чего-то из арсенала билдера(6-й).
этот вопрос задавайте в разделе билдера.

Цитата Сообщение от imjonhson Посмотреть сообщение
boost ,бесплатный даже для коммерческого использования?
http://g.zeos.in/?q=boost.license&m=1

Цитата Сообщение от imjonhson Посмотреть сообщение
Boost для счастливых владельцев XE3
boost для счастливых обладателей с++.
заводится, и работает везде, где заводятся и работают компиляторы языка.
на любых платформах.
под любыми ИДЕ.

Цитата Сообщение от imjonhson Посмотреть сообщение
для ситуаци вроде моей проще налепить костыли, чтение документации поиски статей на родном языке займут время плюс ко всему boost не .h файл
если не осилили boost, смотрите в сторону cereal
http://uscilab.github.io/cereal/

там одни *.h

и да, это намного быстрее, проще, и эффективнее,
чем лепить собственный тормозной и глючный велосипед
с квадратными колесами.

Цитата Сообщение от imjonhson Посмотреть сообщение
Единственный плюс boost.serialization это более высокая скорость сборки и распаковки архива.
одни сплошные плюсы по сравнению с тем,
что вы сами могли бы предложить.
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.02.2017, 12:28 7
Цитата Сообщение от imjonhson Посмотреть сообщение
Boost для счастливых владельцев XE3, у меня пока нет возможности потратить 1500$ на XE3 зато есть когда-то купленный builder6.
Забейте на билдер, используйте что-то бесплатное. Например Qt (потом со времением если потребуется купите комерческую лицензию)
0
02.02.2017, 12:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.02.2017, 12:28
Помогаю со студенческими работами здесь

Можно ли изменить или удалить данные в бинарном файле
Здравствуйте. В C# есть класс BinaryWriter, который позволяет записывать данные в бинарный файл....

В текстовом файле находятся записи о книгах в библиотеке; удалить из файла указанную запись
В текстовом файле находятся записи о книгах в библиотеке. В каждой строке записана информация об...

БД в бинарном файле
Доброго времени суток! Нужно создать БД, которая хранит несколько таблиц. БД с ее данными должна...

Поиск в бинарном файле
мне надо в бинарном файле найти одну 8-ми байтную строку, я сделал вот такой поиск, но он почему то...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru