Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
1362 / 586 / 198
Регистрация: 02.08.2011
Сообщений: 2,880
1

Как записать структуру в бинарный файл одним "блоком"

24.09.2015, 20:55. Просмотров 1685. Ответов 38
Метки нет (Все метки)

Как записать структуру в бинарный файл одним "блоком", если в структуре есть private данные?

C++
1
2
3
4
5
6
7
struct MyStruct{
       char Name[20];
       void getN()  {cin>>N;}
       void showN() {cout<<N;};
   private:
       int N;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    const int N=3;
    MyStruct A[N];
    strcpy(A[0].Name,"Ivan");
     A[0].getN();
 
    strcpy(A[1].Name,"Wasia");
    A[1].getN();
 
    strcpy(A[2].Name,"Petrosan");
    A[2].getN();
 
   //Записать в бинарный файл
   //Прочитать из  файла в массив структур.
 
}
Есть ли для этого какие-то механизмы, трюки или хоть что-то полезное?
Как бы если структур много, а в них данных много, то запись кусочками не очень симпатична.

Интересует как C++, так и вариант с Си, но дублировать темы нельзя, поэтому об обоих языках вопрос в одной ветке.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.09.2015, 20:55
Ответы с готовыми решениями:

Как правильно записать в бинарный файл структуру, в которой есть string?
Предположим есть вот такая структура struct MyStruct { int number; string str; }; Её...

Написать структуру "Список книг" (бинарный файловый ввод/вывод)
Здравствуйте, Дорогие форумчане! Всех с наступающим. Задача: написать 2 консольных приложения:...

Как откомпилировать программу на C++ так, чтобы получить "чистый бинарный файл"?
возникла такая задача-из кода на C++ получить чистый бинарный файл. В случае с ассемблером, у...

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

38
6914 / 5979 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
24.09.2015, 21:05 2
Лучший ответ Сообщение было отмечено daslex как решение

Решение

private как-то мешает записывать её целиком?
C++
1
ofs.write(reinterpret_cast<char *>(A), sizeof(MyStruct) * N);
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
Лучший ответ Сообщение было отмечено daslex как решение

Решение

Цитата Сообщение от daslex Посмотреть сообщение
ничто не мешает
На самом деле мешает.
Если говорить в общем, то классы и структуры, в которых содержатся данные в разных секциях так записывать нельзя, потому что:
Цитата Сообщение от 9.2/13
Nonstatic data members of a (non-union) class with the same access control (Clause 11) are allocated so
that later members have higher addresses within a class object. The order of allocation of non-static data
members with different access control is unspecified
(Clause 11).
Т.е., например, если ты так запишешь структуру программой, скомпилированную одним компилятором, а прочитаешь, скомпилированной другим (или тем же, но с другими настройками), то вполне можешь получить не то, что ожидаешь.
Кроме этого ,есть еще проблема разного порядка байт (которая, впрочем, не важна, если мы не переносим такие дампы между платформами).
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
Цитата Сообщение от nmcf Посмотреть сообщение
это разве не о классах?
Написал в структуре - public/private - это уже не структура, а класс и С-шные законы на него действовать уже не обязаны.

Добавлено через 26 секунд
Цитата Сообщение от daslex Посмотреть сообщение
Т.е. так записывать можно только чистые структуры и классы, в которых абсолютно всё в одной секции, т.е. в секции public или же если абсолютно однозначно и запись и чтение будут выполнятся программой, скомпилированной в одном компиляторе с одними и теми же настройками на момент компиляции, да еще и исключительно для одной платформы?
Строго говоря, да.

Т.е. так записывать можно только чистые структуры и классы, в которых абсолютно всё в одной секции
Причем то, что в одной секции, должно быть объектами POD типов.
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
Цитата Сообщение от nmcf Посмотреть сообщение
Ну если запись и чтение делает одна программа, то allocation должен совпадать.
Не должен, а может. Но, например, нет гарантий, что в одна и та же программа в 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
Цитата Сообщение от nmcf Посмотреть сообщение
Ну не может же одна и та же программа по разному строить одну и ту же структуру, нестыковки будут внутри.
Это еще почему? Написано же, что порядок неопределен.
Компилятор в отладочных целях может расположить элементы в разных секциях в одном порядке, а в релизе, с максимумом оптимизации в другом - это же обычное дело.
Что толку спорить с фактами?
0
:)
Эксперт С++
4764 / 3258 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
24.09.2015, 22:04 12
Цитата Сообщение от DrOffset Посмотреть сообщение
На самом деле мешает.
Если рассуждать с точки зрения совместимости бинарных данных в разных системах, то надо и порядок байтов учитывать.

Не по теме:

P.S. формально речь шла о write-only :)

Цитата Сообщение от DrOffset Посмотреть сообщение
который 15 лет жил и никто его не замечал
Значит другой баг его компенсировал, а исправив этот можно нарушить работу программы.
0
13883 / 7419 / 1759
Регистрация: 30.01.2014
Сообщений: 12,411
24.09.2015, 22:07 13
Цитата Сообщение от Tulosba Посмотреть сообщение
то надо и порядок байтов учитывать.
А я об этом написал же выше.

Цитата Сообщение от Tulosba Посмотреть сообщение
Значит другой баг его компенсировал, а исправив этот можно нарушить работу программы.
Его компенсировала особенность интерпретации UB компилятором. В новой версии UB cтало проявляться иначе и все сломалось

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
P.S. формально речь шла о write-only
Вот вам бы лишь бы придраться, сэр :)

0
1362 / 586 / 198
Регистрация: 02.08.2011
Сообщений: 2,880
24.09.2015, 22:09  [ТС] 14
Можно немного почитать о POD типах и можно увидеть нечто типа:
Чтобы быстро записать на диск сложный заголовок файла наподобие BMP, можно сформировать его в памяти, а затем записать одной командой — но структура данных, в которой формируем заголовок, также должна быть POD’ом.
Вообще не вижу смысла спорить с аргументацией DrOffset,

но моя интуиция мне говорит, что в C++11 может быть так (ну не совсем так, но некоторым подобием такого) может и можно записывать в файл. Это только догадки, ни коим образом не утверждения.
0
6914 / 5979 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
24.09.2015, 22:11 15
Цитата Сообщение от DrOffset Посмотреть сообщение
Компилятор в отладочных целях
Да я не об этом. Конкретный скомпилированный экземпляр программы будет использовать идентичную структуру для всех операций.
0
13883 / 7419 / 1759
Регистрация: 30.01.2014
Сообщений: 12,411
24.09.2015, 22:15 16
Цитата Сообщение от daslex Посмотреть сообщение
но моя интуиция мне говорит, что в C++11
Вообще моя цитата из одного из последних драфтов С++14. И, насколько я знаю, подобное ограничение всегда существовало.
Вот для сишных структур в пределах платформы ABI "стандартизировано" (но мы помним, что в сишных структурах не может быть никаких public\private), почитать можно тут.

Добавлено через 1 минуту
Цитата Сообщение от nmcf Посмотреть сообщение
Конкретный скомпилированный экземпляр программы будет использовать идентичную структуру для всех операций.
С этим никто не спорил Но это несколько эфемерная гарантия, согласись. Разве что жестко зафиксировать версию и настройки компиляторов и ни в коем случае никому другому не давать свою программу собирать из исходников.
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
Цитата Сообщение от nmcf Посмотреть сообщение
Может, есть какие-то настройки компилятора, чтобы жёстко закрепить последовательность полей. Типа #pragma pack для выравнивания.
Да скорее всего есть.
Только не проще ли писать сразу корректные программы, а не искать потом костыли для того, чтобы все не сломалось?
1
Модератор
Эксперт по электронике
8329 / 6181 / 829
Регистрация: 14.02.2011
Сообщений: 21,477
24.09.2015, 22:53 19
Цитата Сообщение от DrOffset Посмотреть сообщение
Т.е., например, если ты так запишешь структуру программой, скомпилированную одним компилятором, а прочитаешь, скомпилированной другим (или тем же, но с другими настройками), то вполне можешь получить не то, что ожидаешь.
так это можно и на простой структуре хапнуть, разное выравнивание и все, приплыли
я бы ввел в класс метод(ы) что то типа
WriteFile ReadFile
и в них бы все и реализовал
а для корректной обработки данных от разных компиляторов, можно ввести поле версия
и при чтении проверять свой файл или нет

Добавлено через 1 минуту
Цитата Сообщение от nmcf Посмотреть сообщение
Типа #pragma pack для выравнивания.
а прагма может делать всепо другому в другом компиляторе
знаменитая MS pragma once, тому пример
0
13883 / 7419 / 1759
Регистрация: 30.01.2014
Сообщений: 12,411
24.09.2015, 22:57 20
Цитата Сообщение от ValeryS Посмотреть сообщение
так это можно и на простой структуре хапнуть
Можно. Но в пределах платформы (например только x86 или только x86_64, или только SPARC32 и т.д.) выравнивание не будет меняться. Там выше ссылка была.
В принципе конечно, если совсем строго подходить к вопросу, то так сохранять структуры можно только с отключенным выравниванием, с гарантией определенного порядка байт и только POD.
Но вопрос с public\private более тонкий, поэтому я высказывался подробно только о нем.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2015, 22:57

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

Записать структуру в бинарный файл
ЛЮДИ подскажите кто знает,чувствую,что ответ где то рядом,а где найти не могу:( Пусть есть...

Как написать регулярное выражение для выдергивания английских букв и символов: "+", ",", ":", "-", " ", "!", "?" и "."
Не могу ни как собразить как написать регулярное выражение для выдергивания английских букв и...

Реализовать структуру "Анкета" с полями "Фамилия", "Пол" и "Адрес"
Здравствуйте. Проходим тему Структуры, не могу понять, как определить количество, само задание: ...

Файл: записать содержимое файла в две таблицы БД - "вопросы" и "ответы".
Есть текстовый файл примерно следующего вида. ? Вопрос 1. -1. Вариант ответа 1 на вопрос 1...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.