|
0 / 0 / 1
Регистрация: 16.12.2006
Сообщений: 88
|
||||||
Как записать структуру в файл?07.01.2008, 05:47. Показов 3831. Ответов 13
Метки нет (Все метки)
есть структура
заранее благодарен Роман
0
|
||||||
| 07.01.2008, 05:47 | |
|
Ответы с готовыми решениями:
13
Как записать структуру в файл и считать ее из нее Как записать структуру в файл с помощью fstream? |
|
0 / 0 / 6
Регистрация: 06.01.2008
Сообщений: 62
|
|||||||||||
| 07.01.2008, 10:05 | |||||||||||
|
HI !
--Igor Soukhov, www.rsdn.ru
0
|
|||||||||||
|
Snork
|
|
| 07.01.2008, 13:42 | |
|
Лучше не работать со структурами вообще. Они и нужны-то только для совместимости со старым кодом :-). Я бы унаследовал класс CFriend от класса, поддерживающего сериализацию (CObject в MFC, например) и переопределил виртуальные ф-ции ввода-вывода. Но это архитектура, а спросить ты, по моему, хотел вот что. Как за один раз кинуть в файл сложный тип данных? Увы, никак. Можно лишь встроенные. Я тоже был разочарован, когда об этом узнал :-{.
Снорк. |
|
|
1 / 1 / 5
Регистрация: 30.04.2007
Сообщений: 225
|
||||||
| 07.01.2008, 16:12 | ||||||
|
2Снорк:
> Лучше не работать со структурами вообще. > Они и нужны-то только для совместимости со старым кодом :-) не совсем понятно, смайлик относится ко всему утверждению или ко второй фразе? Если 'лучше не работать' написано серьёзно, то это очень спорное утверждение... Например, есть мнение, что private-данные, для которых есть открытые методы getXXX() и setXXX(), причём set не делает ничего, кроме присваивания, проще объявить public (де-факто они и так открыты). А выбирать между объявлениями 'struct AAA{ ...' и 'class AAA{ public: ...', можно долго... ![]() > Как за один раз кинуть в файл сложный тип данных? Увы, никак.
правда, с указателями возникают проблемы... а уж с классами, содержащими виртуальные функции, и подавно... Но всё это обходится той же сериализацией.
0
|
||||||
|
Snork
|
|
| 07.01.2008, 17:30 | |
|
Уважаемый McVillan! Смайл, естественно, относился ко всему высказыванию, т.к. всеръез такими выражениями, как 'давайте не будем пользоваться структурами' я не кидаюсь. Насчет Get-Set согласен полностью. Надо проектировать классы так, чтобы реального доступа к private- и protected-данным не было. Обычно это достигается следующим образом: пока не спроектированы все методы, разработчику _запрещается_ проектировать член-переменные. (А избавиться от Get-Set-обработки, сидящей в подкорке, все равно сложно:-().
Насчет того, что сложные типы данных не кидаются в файл. Именно указатели я и имел в виду. Вообще-то пример, который нам привели (с полями имя/телефон) указателей не содержит и может быть скинут так, как Вы советуете. НО! Если через пару дней возникнет необходимость сделать связанный список? Или добавить в структуру иные ссылки (под ссылками я разумею все те же указатели на объекты, на которые осуществляется ссылка)? Что тогда? Не проще ли с самого начала делать все как положено? С уважением - Сергей. |
|
|
1 / 1 / 5
Регистрация: 30.04.2007
Сообщений: 225
|
||||||
| 08.01.2008, 11:58 | ||||||
|
> всерьез такими выражениями, как 'давайте не будем
> пользоваться структурами' я не кидаюсь = )> Насчет того, что сложные типы данных не кидаются в файл. > Именно указатели я и имел в виду. Вариант номер раз. Сделать 'оболочки':
Вариант номер три. Лично мне он больше всего нравится. Хранить все внешние данные в произвольном (не привязанном, вообще говоря, к используемым структурам данных) ТЕКСТОВОМ формате. Сделать парсер и механизмы порождения таких данных -- и наслаждаться жизнью. Если очень хочется, можно использовать что-нибудь новомодное, к примеру, xml (и потом кричать на всех углах, какие мы современные, как мы используем самые-самые распоследние достижения самых-самых технологий... хотя на поверку это банальный csv, только в другом формате... пардон, отвлёкся.) Во-первых, такой подход позволяет просматривать и редактировать любые данные текстовым редактором. Во-вторых, внешние данные могут оставаться неизменными при изменении описывающих их структур (все изменения локализуется в парсере и механизме порождения).
0
|
||||||
|
Snork
|
|
| 08.01.2008, 13:37 | |
|
>Вариант номер раз. Сделать 'оболочки':
>struct Friend{ ...};struct FriendWrapper : Friend{ FriendWrapper *link;}; >Вариант номер два. Сериализация. О чем я и говорил. Факт тот, что или приходится прибегать к наследованию (есть еще вариант с агрегацией), или изначально делать сериализацию (на чем я и настаивал!). Причем сериализация, ИМХО - лучший вариант. > Вариант номер три. Лично мне он больше всего нравится. Хранить все внешние данные в произвольном (не привязанном, вообще говоря, к используемым структурам данных) ТЕКСТОВОМ формате. Сделать парсер и механизмы порождения таких данных -- и наслаждаться жизнью. Если очень хочется, можно использовать что-нибудь новомодное, к примеру, xml (и потом кричать на всех углах, какие мы современные, как мы используем самые-самые распоследние достижения самых-самых технологий... хотя на поверку это банальный csv, только в другом формате... пардон, отвлёкся.) А вот про текстовый формат рискну поспорить. Мало того, что он занимает в разы больше места, так еще и обрабатывается дольше. (Необходима конвертация число <-> текст). Заявляю ответственно, что загрузка DSAAgrd-файла (один из самых распространенных форматов по хранению сеток) с числом узлов 300x300 на моем DualPIIIx800 вызывает трехсекундный ступор, в то время как загрузка через COM сервер, который передает данные в бинарном формате осуществляется практически незаметно. Поэтому если данные нужно хранить для реальных систем, а не для красоты - всегда следует предусматривать разростание среднего размера файлов. Вообще-то наш пример в конвертации не нуждается - это ТЕКСТ. Но если этот зародыш телефонной книги забивать данными регулярно, то скоро сам автор поймет, что телефон надо хранить в виде длинного целого. Засим прощаюсь, с уважением Снорк. |
|
|
Snork
|
|
| 08.01.2008, 16:01 | |
|
Тут пришел хороший программист, мы еще подумали вместе и пришли к выводу - можно делать еще так: или наплевать на указатели и кидать их в файл (коряво, но если структура большая - безболезненно), или же включать указатели последними, а в write передовать sizeof(tagMYSTRUCTURE) - n * sizeof(void*), где n - число указателей. Остается открытым вопрос инициализации такой структуры, т.к. если аналогично можно считать данные из файла, то указатели надо генерить вручную. И еще вот что. Если у нас массив структур, а не один экземпляр, то лучше фиктивные значения указателей все же сохранять - тогда можно передавать адрес первой структуры и через буфер сохранять/восстанавливать весь массив за одно чтение/запись. Но вопрос об инициализации указателей остается и в этом случае.
С уважением - Снорк. |
|
|
1 / 1 / 5
Регистрация: 30.04.2007
Сообщений: 225
|
|
| 08.01.2008, 16:52 | |
|
> А вот про текстовый формат рискну поспорить.
Люблю я это дело! ![]() > ...он занимает в разы больше места... да > ...обрабатывается дольше... да > ...Поэтому если данные нужно хранить для реальных систем, > а не для красоты - всегда следует предусматривать разростание > среднего размера файлов ...или использование базы данных. При разрастании объёмов -- очень способствует! ![]() > ...телефон надо хранить в виде длинного целого... '111-22-33, добавочный 444' -- это какое число? в рекламах регулярно видел строчки типа 1-800-12345-CALL-NOW... их туда же? ![]() И ещё одно про текст. Недавно мне нужно было перенести (скопировать) несколько таблиц (ну, штук 100 примерно) базы данных с одного сервера на другой. Чего уж проще: backup на одной, restore на другой... Вот только беда: базы создавались с немножко разными опциями... И умная система отказывалась распаковывать 'чужие' файлы. Обмануть её удалось совершенно тривиально: экспорт нужных таблиц в _текстовый_ файл, затем импорт на другой машине. Вот. И напоследок. Универсальных решений не бывает. Бывают решения, более или менее подходящие для данной задачи.
0
|
|
|
Snork
|
|
| 08.01.2008, 18:44 | |
|
>...или использование базы данных. При разрастании объёмов -- очень способствует!
![]() Почему-то разработчики моего формата предпочли не делать базы данных. Это - фактор 'свыше' ![]() >'111-22-33, добавочный 444' -- это какое число? 1112233444 == 0 x 42 4B 55 E4. 8 полубайт == 4 байта == sizeof(DWORD). >в рекламах регулярно видел строчки типа 1-800-12345-CALL-NOW... их туда же? ![]() 180012345 == 0 x 0A BA C5 39. Предлагаю новый форум: как набрать на телефоне 'CALL-NOW!' (Напоминает анекдот про Бивиса, который не смог вызвать Службу 911 - кнопки 'одиннадцать' не нашел ;-)) При визуализации телефона разделители можно генерировать по шаблону, а всяким номеронабирающим программам они нужны, как собаке пятое колесо. >И напоследок. Универсальных решений не бывает. Бывают решения, более или менее подходящие для данной задачи. Чем хороши банальности - с ними никто не спорит, а флейм затухает ;-) С уважением - Снорк. |
|
|
Snork
|
|
| 08.01.2008, 18:48 | |
|
Черт!
>...разростание... Разрастание, конечно! Снорк. |
|
|
1 / 1 / 5
Регистрация: 30.04.2007
Сообщений: 225
|
|
| 09.01.2008, 13:49 | |
|
Ну вот, от структур плавно перетекли к телефонам...
![]() >> '111-22-33, добавочный 444' > 1112233444 то есть семизначный московский телефон плавно преобразовался в десять цифр? а номеронабирающая программа, наверное, сама всё поймёт и хорошо поставленным синтезированным голосом продиктует последние три цифры девушке на коммутаторе? )> Предлагаю новый форум: как набрать на телефоне 'CALL-NOW!' мне кажется, что имеются в виду буквы, написанные на кнопочных телефонах... то есть call-now транслируется в 2255-669. А вообще, надо бы всяких заграничных жителей об этом поспрашивать. > При визуализации телефона разделители можно генерировать по шаблону то есть как минимум привязывать к телефону шаблон? по крайней мере, один из нескольких вариантов? С не меньшим уважением.
0
|
|
|
Snork
|
|
| 09.01.2008, 15:01 | |
|
>а номеронабирающая программа, наверное, сама всё поймёт и хорошо поставленным синтезированным голосом продиктует последние три цифры девушке на коммутаторе?
)Я думаю, что номера с добавочными цифрами не часто используются для автоматического номеронабирания. Накрайняк, программа 'нажмет' лишние 3 кнопки, что никак не скажется на звонке. Остальное сделает усеръ. А вообще-то про телефонную связь знаю мало, это не ирония, а следствие моего предпочтения не платить за время соединения, пользуясь, в настоящее время, выделенкой. >мне кажется, что имеются в виду буквы, написанные на кнопочных телефонах... то есть call-now транслируется в 2255-669. А вообще, надо бы всяких заграничных жителей об этом поспрашивать. Если так - то надо переходить на очень длинное целое;-) бит в 64 где-то... Хотя и думаю до сих пор, что это просто - 'заглушка' для цены. ('Звоните сейчас - и вы услышите, что цены снизились еще больше!!!') >то есть как минимум привязывать к телефону шаблон? по крайней мере, один из нескольких вариантов? Вставлять после каждой третьей цифири тире - самый простой вариант. Его можно усложнить по мере надобности. Со все возрастающим уважением ;-) (этот смайл относится к форме высказывания, но не к содержанию оного), Снорк. |
|
|
0 / 0 / 6
Регистрация: 06.01.2008
Сообщений: 62
|
|
| 09.01.2008, 15:27 | |
|
Зашел чито бы поправить свой ответ... так как слово friend зарезервировано в C++ - то имя параметра в операторах нато поменять на friend_ =)
ps: интересные тут форумы =) --Igor Soukhov, www.rsdn.ru
0
|
|
| 09.01.2008, 15:27 | |
|
Помогаю со студенческими работами здесь
14
Записать структуру в файл Записать структуру в файл с++ Записать структуру в бинарный файл Как правильно записать в бинарный файл структуру, в которой есть string? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes.
А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения
развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит:
токи, напряжения и их 1 и 2 производные при t = 0;. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|