1362 / 586 / 198
Регистрация: 02.08.2011
Сообщений: 2,880
|
|||||||||||
1 | |||||||||||
Как записать структуру в бинарный файл одним "блоком"24.09.2015, 20:55. Просмотров 1685. Ответов 38
Метки нет Все метки)
(
Как записать структуру в бинарный файл одним "блоком", если в структуре есть private данные?
Как бы если структур много, а в них данных много, то запись кусочками не очень симпатична. Интересует как C++, так и вариант с Си, но дублировать темы нельзя, поэтому об обоих языках вопрос в одной ветке.
0
|
|
24.09.2015, 20:55 | |
Как правильно записать в бинарный файл структуру, в которой есть string?
Как откомпилировать программу на C++ так, чтобы получить "чистый бинарный файл"? Записать структуру в бинарный файл |
|
6914 / 5979 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
|
||||||
24.09.2015, 21:05 | 2 | |||||
![]() Решение
private как-то мешает записывать её целиком?
1
|
1362 / 586 / 198
Регистрация: 02.08.2011
Сообщений: 2,880
|
|
24.09.2015, 21:14 [ТС] | 3 |
Все норм. ничто не мешает. ) понял.
0
|
13883 / 7419 / 1759
Регистрация: 30.01.2014
Сообщений: 12,411
|
|
24.09.2015, 21:24 | 4 |
![]() Решение
На самом деле мешает.
Если говорить в общем, то классы и структуры, в которых содержатся данные в разных секциях так записывать нельзя, потому что: ![]() Кроме этого ,есть еще проблема разного порядка байт (которая, впрочем, не важна, если мы не переносим такие дампы между платформами).
2
|
1362 / 586 / 198
Регистрация: 02.08.2011
Сообщений: 2,880
|
|
24.09.2015, 21:35 [ТС] | 5 |
Т.е. так записывать можно только чистые структуры и классы, в которых абсолютно всё в одной секции, т.е. в секции public или же если абсолютно однозначно и запись и чтение будут выполнятся программой, скомпилированной в одном компиляторе с одними и теми же настройками на момент компиляции, да еще и исключительно для одной платформы?
0
|
6914 / 5979 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
|
|
24.09.2015, 21:39 | 6 |
DrOffset, это разве не о классах?
0
|
13883 / 7419 / 1759
Регистрация: 30.01.2014
Сообщений: 12,411
|
|
24.09.2015, 21:45 | 7 |
Написал в структуре - public/private - это уже не структура, а класс и С-шные законы на него действовать уже не обязаны.
Добавлено через 26 секунд Строго говоря, да.
1
|
6914 / 5979 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
|
|
24.09.2015, 21:46 | 8 |
Ну если запись и чтение делает одна программа, то allocation должен совпадать.
0
|
13883 / 7419 / 1759
Регистрация: 30.01.2014
Сообщений: 12,411
|
|
24.09.2015, 21:51 | 9 |
Не должен, а может. Но, например, нет гарантий, что в одна и та же программа в debug\release вариантах не будет вести себя по-разному.
Естественно в реальности все может быть хорошо. Мы вот недавно баг исправили, который 15 лет жил и никто его не замечал, пока компилятор не обновили. Мое дело предупредить, а вы сами решайте что с этим делать дальше.
1
|
6914 / 5979 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
|
|
24.09.2015, 21:55 | 10 |
Ну не может же одна и та же программа по разному строить одну и ту же структуру, нестыковки будут внутри.
0
|
13883 / 7419 / 1759
Регистрация: 30.01.2014
Сообщений: 12,411
|
|
24.09.2015, 22:02 | 11 |
Это еще почему? Написано же, что порядок неопределен.
Компилятор в отладочных целях может расположить элементы в разных секциях в одном порядке, а в релизе, с максимумом оптимизации в другом - это же обычное дело. Что толку спорить с фактами?
0
|
:)
![]() 4764 / 3258 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
24.09.2015, 22:04 | 12 |
Если рассуждать с точки зрения совместимости бинарных данных в разных системах, то надо и порядок байтов учитывать.
Не по теме: P.S. формально речь шла о write-only :)
0
|
13883 / 7419 / 1759
Регистрация: 30.01.2014
Сообщений: 12,411
|
|
24.09.2015, 22:07 | 13 |
А я об этом написал же выше.
Его компенсировала особенность интерпретации UB компилятором. В новой версии UB cтало проявляться иначе и все сломалось ![]() Добавлено через 1 минуту
0
|
1362 / 586 / 198
Регистрация: 02.08.2011
Сообщений: 2,880
|
|
24.09.2015, 22:09 [ТС] | 14 |
Можно немного почитать о POD типах и можно увидеть нечто типа:
но моя интуиция мне говорит, что в C++11 может быть так (ну не совсем так, но некоторым подобием такого) может и можно записывать в файл. Это только догадки, ни коим образом не утверждения.
0
|
6914 / 5979 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
|
|
24.09.2015, 22:11 | 15 |
Да я не об этом. Конкретный скомпилированный экземпляр программы будет использовать идентичную структуру для всех операций.
0
|
13883 / 7419 / 1759
Регистрация: 30.01.2014
Сообщений: 12,411
|
|
24.09.2015, 22:15 | 16 |
Вообще моя цитата из одного из последних драфтов С++14. И, насколько я знаю, подобное ограничение всегда существовало.
Вот для сишных структур в пределах платформы ABI "стандартизировано" (но мы помним, что в сишных структурах не может быть никаких public\private), почитать можно тут. Добавлено через 1 минуту С этим никто не спорил ![]()
1
|
6914 / 5979 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
|
|
24.09.2015, 22:18 | 17 |
Может, есть какие-то настройки компилятора, чтобы жёстко закрепить последовательность полей. Типа #pragma pack для выравнивания.
0
|
13883 / 7419 / 1759
Регистрация: 30.01.2014
Сообщений: 12,411
|
|
24.09.2015, 22:22 | 18 |
Да скорее всего есть.
Только не проще ли писать сразу корректные программы, а не искать потом костыли для того, чтобы все не сломалось? ![]()
1
|
Модератор
![]() 8329 / 6181 / 829
Регистрация: 14.02.2011
Сообщений: 21,477
|
|
24.09.2015, 22:53 | 19 |
так это можно и на простой структуре хапнуть, разное выравнивание и все, приплыли
я бы ввел в класс метод(ы) что то типа WriteFile ReadFile и в них бы все и реализовал а для корректной обработки данных от разных компиляторов, можно ввести поле версия и при чтении проверять свой файл или нет Добавлено через 1 минуту а прагма может делать всепо другому в другом компиляторе знаменитая MS pragma once, тому пример
0
|
13883 / 7419 / 1759
Регистрация: 30.01.2014
Сообщений: 12,411
|
|
24.09.2015, 22:57 | 20 |
Можно. Но в пределах платформы (например только x86 или только x86_64, или только SPARC32 и т.д.) выравнивание не будет меняться. Там выше ссылка была.
В принципе конечно, если совсем строго подходить к вопросу, то так сохранять структуры можно только с отключенным выравниванием, с гарантией определенного порядка байт и только POD. Но вопрос с public\private более тонкий, поэтому я высказывался подробно только о нем.
0
|
24.09.2015, 22:57 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.
Как написать регулярное выражение для выдергивания английских букв и символов: "+", ",", ":", "-", " ", "!", "?" и "." Реализовать структуру "Анкета" с полями "Фамилия", "Пол" и "Адрес"
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |