В моем коде моделирования для системы частиц у меня есть класс, определенный для частиц, и каждая частица имеет свойство pos
, содержащее ее положение, которое равно double pos[3];
, поскольку на каждую частицу приходится 3 координатных компонента. Таким образом, если объект частицы определен как particles = new Particle[npart];
(так как у нас npart
много частиц), то, например, y-компонент 2-й частицы будет доступен с помощью double dummycomp = particles[1].pos[1];
Чтобы сохранить частицы в файле доиспользуя двоичный файл, который я использовал бы (сохраненный как txt, с плавающей точкой точности 10
и одной частицей на строку):
#include <iostream>
#include <fstream>
ofstream outfile("testConfig.txt", ios::out);
outfile.precision(10);
for (int i=0; i<npart; i++){
outfile << particle[i].pos[0] << " " << particle[i].pos[1] << " " << particle[i].pos[2] << endl;
}
outfile.close();
Но теперь, чтобы сэкономить место, я пытаюсь сохранить конфигурацию как двоичный файлфайл, и моя попытка, вдохновленная здесь , была следующей:
ofstream outfile("test.bin", ios::binary | ios::out);
for (int i=0; i<npart; i++){
outfile.write(reinterpret_cast<const char*>(particle[i].pos),streamsize(3*sizeof(double)));
}
outfile.close();
, но я сталкиваюсь с ошибкой сегментации при попытке запустить ее. Мои вопросы:
- Я делаю что-то не так с
reinterpret_cast
или, скорее, в аргументе streamsize()
? - В идеале было бы здорово, если бы сохраненный двоичный формат могтакже читайте в Python, позволяет ли мой подход (когда-то исправленный) для этого?
рабочий пример для старого подхода к сохранению (недвоичный):
#include <iostream>
#include <fstream>
using namespace std;
class Particle {
public:
double pos[3];
};
int main() {
int npart = 2;
Particle particles[npart];
//initilizing the positions:
particles[0].pos[0] = -74.04119568;
particles[0].pos[1] = -44.33692582;
particles[0].pos[2] = 17.36278231;
particles[1].pos[0] = 48.16310086;
particles[1].pos[1] = -65.02325252;
particles[1].pos[2] = -37.2053818;
ofstream outfile("testConfig.txt", ios::out);
outfile.precision(10);
for (int i=0; i<npart; i++){
outfile << particles[i].pos[0] << " " << particles[i].pos[1] << " " << particles[i].pos[2] << endl;
}
outfile.close();
return 0;
}
И чтобы сохранить положения частиц в двоичном виде, замените сохраненную часть вышеприведенного образца на
ofstream outfile("test.bin", ios::binary | ios::out);
for (int i=0; i<npart; i++){
outfile.write(reinterpret_cast<const char*>(particles[i].pos),streamsize(3*sizeof(double)));
}
outfile.close();
2-е добавление: чтение двоичного кода в Python
Мне удалось прочитать сохраненный двоичный файл в python следующим образом, используя numpy:
data = np.fromfile('test.bin', dtype=np.float64)
data
array([-74.04119568, -44.33692582, 17.36278231, 48.16310086,
-65.02325252, -37.2053818 ])
Но, учитывая сомнения в комментариях относительно непереносимости двоичного формата, яне уверен, что этот тип чтения в Python всегда будет работать! Было бы очень хорошо, если бы кто-то мог объяснить надежность такого подхода.