Как лучше всего загрузить элементы данных из двоичного файла в C ++? [дублировать]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как лучше всего загрузить элементы данных из двоичного файла в C ++? [дублировать]

Сообщение 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, и каждый раз, когда его реализация будет изменяться, мне приходилось изменять код за пределами класса. Спасибо за любые идеи. Хотя это было бы осуществимым решением, я хотел бы сохранить контроль над тем, как данные записываются в файл как можно больше. Я ожидаю некоторых узких мест в будущем. Обычно это принести дополнительную библиотеку в проект для одной задачи чтения/записи?

Подробнее здесь: https://stackoverflow.com/questions/796 ... -file-in-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»