Я разрабатываю класс с несколькими членами данных, и я хочу сохранить эти элементы данных в двоичном файле в одной части проекта. В другой части проекта (независимой бинарной) я хочу загрузить их и «построить объект, используя их». Таким образом, в «программе сохранения» было бы что -то вроде этого: < /p>
LoadableClass a(SomeOtherObjectOfSomeOtherClass); // Construct it from another object
std::ofstream BinaryStream("largefile.dat", std::binary);
a.WriteToFile(BinaryStream);
< /code>
В другой программе я хотел бы построить его из файла: < /p>
std::ifstream BinaryStream("largefile.dat", std::binary);
LoadableClass a(BinaryStream);
a.DoSomeMagic();
< /code>
Сам выглядит сам класс содержит некоторые матрицы, которые могут занять до 1 ГБ памяти. < /p>
class LoadableClass {
private:
int rows, cols;
Matrix mat;
public:
LoadableClass(const SomeOtherClass& other); // Construct it from some other class (calculate).
void WriteToFile(std::ofstream& BinSt) const { Write the data to the stream here.}
LoadableClass(std::ifstream BinSt) :
rows{
[&]() -> int {
int temprows;
BinSt.read(reinterpret_cast(&temprows), sizeof(temprows));
return temprows;
}()
},
cols{
[&]() -> int {
int tempcols;
BinSt.read(reinterpret_cast(&tempcols), sizeof(tempcols));
return tempcols;
}()
},
mat{
[&]() -> MatrixXd {
MatrixXd tempmat(rows, cols);
BinSt.read(reinterpret_cast(tempmat.data()), rows * cols * sizeof(double));
return tempmat;
}()
}{}
< /code>
Кажется, что этот код работает. Еще один аспект этого класса заключается в том, что члены данных никогда не должны меняться. Как только объект будет построен, они не изменятся (на самом деле я мог бы сделать их постоянными). Что будет лучше? Я думал, что смогу прочитать из файла в теле конструктора, а не в списке инициализаторов. Тем не менее, по умолчанию конструкция матрицы немного неловко. < /P>
Альтернативно, я мог бы позаботиться о чтении из файла за пределами класса и просто иметь конструктор со всеми членами данных < /p>
LoadableClass(const int r, const in c, const MatrixXd m) : rows{r}, cols{c}, mat{m}{}
< /code>
Однако мне это тоже кажется неловким. Код, который строит объект из файла, должен был бы знать детали реализации LoadableClass, и каждый раз, когда его реализация будет изменяться, мне приходилось изменять код за пределами класса. Спасибо за любые идеи. Хотя это было бы осуществимым решением, я хотел бы сохранить контроль над тем, как данные записываются в файл как можно больше. Я ожидаю некоторых узких мест в будущем. Обычно это принести дополнительную библиотеку в проект для одной задачи чтения/записи?
Подробнее здесь: https://stackoverflow.com/questions/796 ... -file-in-c
Как лучше всего загрузить элементы данных из двоичного файла в C ++? [дублировать] ⇐ C++
Программы на C++. Форум разработчиков
1746259856
Anonymous
Я разрабатываю класс с несколькими членами данных, и я хочу сохранить эти элементы данных в двоичном файле в одной части проекта. В другой части проекта (независимой бинарной) я хочу загрузить их и «построить объект, используя их». Таким образом, в «программе сохранения» было бы что -то вроде этого: < /p>
LoadableClass a(SomeOtherObjectOfSomeOtherClass); // Construct it from another object
std::ofstream BinaryStream("largefile.dat", std::binary);
a.WriteToFile(BinaryStream);
< /code>
В другой программе я хотел бы построить его из файла: < /p>
std::ifstream BinaryStream("largefile.dat", std::binary);
LoadableClass a(BinaryStream);
a.DoSomeMagic();
< /code>
Сам выглядит сам класс содержит некоторые матрицы, которые могут занять до 1 ГБ памяти. < /p>
class LoadableClass {
private:
int rows, cols;
Matrix mat;
public:
LoadableClass(const SomeOtherClass& other); // Construct it from some other class (calculate).
void WriteToFile(std::ofstream& BinSt) const { Write the data to the stream here.}
LoadableClass(std::ifstream BinSt) :
rows{
[&]() -> int {
int temprows;
BinSt.read(reinterpret_cast(&temprows), sizeof(temprows));
return temprows;
}()
},
cols{
[&]() -> int {
int tempcols;
BinSt.read(reinterpret_cast(&tempcols), sizeof(tempcols));
return tempcols;
}()
},
mat{
[&]() -> MatrixXd {
MatrixXd tempmat(rows, cols);
BinSt.read(reinterpret_cast(tempmat.data()), rows * cols * sizeof(double));
return tempmat;
}()
}{}
< /code>
Кажется, что этот код работает. Еще один аспект этого класса заключается в том, что члены данных никогда не должны меняться. Как только объект будет построен, они не изменятся (на самом деле я мог бы сделать их постоянными). Что будет лучше? Я думал, что смогу прочитать из файла в теле конструктора, а не в списке инициализаторов. Тем не менее, по умолчанию конструкция матрицы немного неловко. < /P>
Альтернативно, я мог бы позаботиться о чтении из файла за пределами класса и просто иметь конструктор со всеми членами данных < /p>
LoadableClass(const int r, const in c, const MatrixXd m) : rows{r}, cols{c}, mat{m}{}
< /code>
Однако мне это тоже кажется неловким. Код, который строит объект из файла, должен был бы знать детали реализации LoadableClass, и каждый раз, когда его реализация будет изменяться, мне приходилось изменять код за пределами класса. Спасибо за любые идеи. Хотя это было бы осуществимым решением, я хотел бы сохранить контроль над тем, как данные записываются в файл как можно больше. Я ожидаю некоторых узких мест в будущем. Обычно это принести дополнительную библиотеку в проект для одной задачи чтения/записи?
Подробнее здесь: [url]https://stackoverflow.com/questions/79604455/what-is-the-best-way-to-load-data-members-from-binary-file-in-c[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия