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

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

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

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

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

Считывать линейный массив из файла C++
Бинарное чтение из файла с пoмощью функции fread() C++
C++ Как можно считывать инфу с файла в виде массива строк?
C++ В начало двоичного файла целого типа дописать нечетные элементы этого файла.
Можно ли продолжить считывать в поток после ^Z ? 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
1321 / 1202 / 109
Регистрация: 20.03.2009
Сообщений: 4,306
Записей в блоге: 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
1321 / 1202 / 109
Регистрация: 20.03.2009
Сообщений: 4,306
Записей в блоге: 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++
C++ чтение данных из открытого файла (fread)
C++ Считывание из файла (fread) в вектор
Как считывать матрицу из файла? C++
Выяснить, можно ли с заданного поля одним ходом слона попасть на другое заданное поле C++

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

Или воспользуйтесь поиском по форуму:
Dmitriy_M
1321 / 1202 / 109
Регистрация: 20.03.2009
Сообщений: 4,306
Записей в блоге: 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
Ответ Создать тему
Опции темы

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