С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Можно ли считывать поля класса из двоичного файла одним fread - C++

22.10.2012, 14:49. Просмотров 422. Ответов 7
Метки нет (Все метки)

Можно ли считывать поля класса из двоичного файла одним fread?
C++
1
fread(this, sizeof(*this), 1, myFile);
Слышал, что компиляторы по разному трактуют порядок полей в классе, из-за чего такая строка может интерпретироваться иначе, чем хотелось бы мне. Вот и решил переспросить, ато может я не так понял что-то.
И, если все-таки так можно считывать, что делать с полями вида char*? Дело в том, что :
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
char *a;
public :
A() {a = new char[100000];}
};
void main()
{
A k;
int x = sizeof(k), y = sizeof(A);
}
x и y будут равны 4 (или 6 при х64), что логично, ведь поле - указатель, но на деле в дв. файл нужно записать не указатель, а всю строку. Здесь уже обычным sizeof не обойтись? А что если в классе 4 строки и 8 int'ов (если так же учиывать, что int записывается, как :
C++
1
fwrite(&someInt, 4, 1, myFile);
, из-за того, что sizeof(someInt) в x64 будет равен 6, что приведет к неправильному чтению? Никак, кроме 12-и fwrite/fread не обойтись?

Добавлено через 6 часов 23 минуты
up-to-date
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2012, 14:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно ли считывать поля класса из двоичного файла одним fread (C++):

Удалить записанный экземпляр класса из двоичного файла - C++
Задача - удалить записанный экземпляр класса из дв. файла. (В моём решении, удаленный экземпляр просто затирается последним) for...

Выяснить можно ли с поля (k,l) одним ходом ферьзя попасть на поле(m,n). Если нет, то выяснить, как это можно сделать за два хода - C++
Поле шахмотной доски определяеся парой натуральных чисел, каждая из которых не превосходит восьми: первое число номер вертикали (при счете...

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

Друзья, подскажите, говорят, что можно поля класса инициализировать в момент объявления класса. Как это сделать? - C++
Скажу сразу, а то сейчас начнется, что я прекрасно понимаю, что поля класса при объявлении инициализировать нельзя. Можно конструктором при...

Выяснить, можно ли с заданного поля одним ходом слона попасть на другое заданное поле - C++
Здравствуйте помогите пожалуйста, как это можно сделать за два хода Поле шахматной доски определяется парой натуральных чисел, каждое из...

Какие поля можно считывать из формы сервлетом? - Java EE
Здравствуйте , у меня такой вопрос, вот допустим html : <form action="Servlet" method="POST"> <input...

7
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
22.10.2012, 15:01 #2
Идея хорошая, но лучше о ней не думать. Переменные будут следовать в том порядке в котором объявлены, проблема с sizeof в принципе решаема... но с char* сделать ничего не получится, хотя бы по тому, что char* это указатель весящий примерно 4 байта, и память в которую нужно будет записать соответствующую строку находится не в том месте, где находится экземпляр класса содержащего указатель. Естественно fread. Вообще выполениня считывания в соответствии со всевозможными спецификациями как правило изобилует большими списками вызовов подобных функций...
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
22.10.2012, 16:13  [ТС] #3
CEBEP, так и не понял, почему об это "лучше не думать".. Следующее предложение говорит об обратном..
0
Dmitriy_M
1363 / 1246 / 114
Регистрация: 20.03.2009
Сообщений: 4,462
Записей в блоге: 11
22.10.2012, 16:24 #4
Что мешает перегрузить операторы ввода/вывода и и использовать стандартные потоки ввода/вывода?

Цитата Сообщение от CEBEP Посмотреть сообщение
Переменные будут следовать в том порядке в котором объявлены, проблема с sizeof в принципе решаема...
Вы уверены?
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
22.10.2012, 16:42  [ТС] #5
Dmitriy_M, и что мне это даст в данном случае? Вопрос стоит не "как считать класс", а "можно ли считать класс одним fread"
0
Dmitriy_M
1363 / 1246 / 114
Регистрация: 20.03.2009
Сообщений: 4,462
Записей в блоге: 11
22.10.2012, 16:50 #6
Цитата Сообщение от nexen Посмотреть сообщение
Вопрос стоит не "как считать класс", а "можно ли считать класс одним fread"
в общем случае нельзя.
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
22.10.2012, 18:23  [ТС] #7
Dmitriy_M, "общем"? А если бы у меня была структура с простыми полями (обычные типы или классы/структуры), но без указателей (даже в класса/структурах)?
0
Dmitriy_M
1363 / 1246 / 114
Регистрация: 20.03.2009
Сообщений: 4,462
Записей в блоге: 11
22.10.2012, 20:59 #8
Что значит обычные типы? Очень немного о POD типах.
Понятно, что std::string вроде как обычный тип, но не POD тип.
Так же стандарт C++ не говорит, что поля структуры должны располагаться последовательно в памяти и размер структуры в памяти, должен соответствовать сумме полей структуры.
Сделано это для того, что бы разработчики компилятора могли произвести оптимизацию.
Побороть это можно прагмой pack, но оптимизации не будет.

Добавлено через 2 часа 16 минут
Если хочешь сделать через один read/write, то при записи сохрани значение полей структуры во временный буфер, а потом записывай этот буфер.
Такой подход считается нормальной практикой.
1
22.10.2012, 20:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2012, 20:59
Привет! Вот еще темы с ответами:

Можно ли одним ходом слона попасть с поля (k, l) на поле (m, n) - PascalABC.NET
Поле шахматной доски определяется парой натуральных чисел, каждое из которых не превосходит восьми: первое число — номер вертикали (при...

можно ли с поля (k,l) одним ходом ферзи попасть в поле (m,n). - Delphi
Поле шахматной доски определяется парой натуральных чисел,каждое из которых не превосходит 8.первое число номер вертикали(при счете слева...

Можно ли с поля (k, l) одним ходом слона попасть на поле (m, n)? - Turbo Pascal
Поле шахматной доски определяется парой натуральных чисел, каждое из которых не превосходит восьми: первое число — номер вертикали (при...

VB 6 Что делать если имеется два текстовых поля с одним названием класса ? TLabeledEdit - Visual Basic
Имеется два текстовых поля у обоих одинаковый класс название TLabeledEdit Когда я вписываю текст в класс под названием TLabeledEdit...


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

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

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