Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
22.10.2012, 14:49     Можно ли считывать поля класса из двоичного файла одним fread #1
Можно ли считывать поля класса из двоичного файла одним 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2012, 14:49     Можно ли считывать поля класса из двоичного файла одним fread
Посмотрите здесь:

Бинарное чтение из файла с пoмощью функции fread() C++
C++ как можно считывать инфу с файла в виде массива строк?
Выяснить можно ли с поля (k,l) одним ходом ферьзя попасть на поле(m,n). Если нет, то выяснить, как это можно сделать за два хода C++
Удалить записанный экземпляр класса из двоичного файла C++
C++ Друзья, подскажите, говорят, что можно поля класса инициализировать в момент объявления класса. Как это сделать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
22.10.2012, 15:01     Можно ли считывать поля класса из двоичного файла одним fread #2
Идея хорошая, но лучше о ней не думать. Переменные будут следовать в том порядке в котором объявлены, проблема с sizeof в принципе решаема... но с char* сделать ничего не получится, хотя бы по тому, что char* это указатель весящий примерно 4 байта, и память в которую нужно будет записать соответствующую строку находится не в том месте, где находится экземпляр класса содержащего указатель. Естественно fread. Вообще выполениня считывания в соответствии со всевозможными спецификациями как правило изобилует большими списками вызовов подобных функций...
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
22.10.2012, 16:13  [ТС]     Можно ли считывать поля класса из двоичного файла одним fread #3
CEBEP, так и не понял, почему об это "лучше не думать".. Следующее предложение говорит об обратном..
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,209
Записей в блоге: 11
22.10.2012, 16:24     Можно ли считывать поля класса из двоичного файла одним fread #4
Что мешает перегрузить операторы ввода/вывода и и использовать стандартные потоки ввода/вывода?

Цитата Сообщение от CEBEP Посмотреть сообщение
Переменные будут следовать в том порядке в котором объявлены, проблема с sizeof в принципе решаема...
Вы уверены?
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
22.10.2012, 16:42  [ТС]     Можно ли считывать поля класса из двоичного файла одним fread #5
Dmitriy_M, и что мне это даст в данном случае? Вопрос стоит не "как считать класс", а "можно ли считать класс одним fread"
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,209
Записей в блоге: 11
22.10.2012, 16:50     Можно ли считывать поля класса из двоичного файла одним fread #6
Цитата Сообщение от nexen Посмотреть сообщение
Вопрос стоит не "как считать класс", а "можно ли считать класс одним fread"
в общем случае нельзя.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
22.10.2012, 18:23  [ТС]     Можно ли считывать поля класса из двоичного файла одним fread #7
Dmitriy_M, "общем"? А если бы у меня была структура с простыми полями (обычные типы или классы/структуры), но без указателей (даже в класса/структурах)?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2012, 20:59     Можно ли считывать поля класса из двоичного файла одним fread
Еще ссылки по теме:

C++ чтение данных из открытого файла (fread)
C++ реализации класса «Дерево двоичного поиска»
C++ Считывание из файла (fread) в вектор

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

Или воспользуйтесь поиском по форуму:
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,209
Записей в блоге: 11
22.10.2012, 20:59     Можно ли считывать поля класса из двоичного файла одним fread #8
Что значит обычные типы? Очень немного о POD типах.
Понятно, что std::string вроде как обычный тип, но не POD тип.
Так же стандарт C++ не говорит, что поля структуры должны располагаться последовательно в памяти и размер структуры в памяти, должен соответствовать сумме полей структуры.
Сделано это для того, что бы разработчики компилятора могли произвести оптимизацию.
Побороть это можно прагмой pack, но оптимизации не будет.

Добавлено через 2 часа 16 минут
Если хочешь сделать через один read/write, то при записи сохрани значение полей структуры во временный буфер, а потом записывай этот буфер.
Такой подход считается нормальной практикой.
Yandex
Объявления
22.10.2012, 20:59     Можно ли считывать поля класса из двоичного файла одним fread
Ответ Создать тему
Опции темы

Текущее время: 09:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru