gpt4 book ai didi

c++ - 将 C++ 结果保存为二进制文件供以后使用

转载 作者:太空狗 更新时间:2023-10-29 20:01:55 27 4
gpt4 key购买 nike

我正在编写一个求解 PDE 并将解保存在二维数组中的 C++ 程序。然后它对该 PDE 的结果进行处理。然而,精确地求解 PDE 需要大量的计算。因此,求解部分只需执行一次,但应保存结果,以便我稍后返回。

因此,我写了两个不同的代码:

  1. 求解 pde 并将结果保存在矩阵 A 中。矩阵 A 保存在二进制文件中。

  2. 读取二进制文件中的值并对结果进行计算。

但是,当我在第二个代码中读取二进制文件时,它只是一个空数组,不包含我在其他代码中保存的值。

如果我在代码 1 中读取它,它会按预期运行。

我做错了什么?甚至可以在其他应用程序中读取二进制文件的值吗?我应该完全不同地处理这个问题吗?

我将这两个代码保存在不同的项目中,我应该以某种方式将它们链接起来吗?或者这两个代码应该在同一个项目中?

我花了几天时间在网上搜索解决方案,但我只找到有关如何在同一代码(例如 thisthis )中打开和保存二进制文件的问题和答案。这是否意味着我正在尝试做的事情是不可能的,或者我没有找到正确的来源?

我是 C++ 的完全初学者,如果有任何帮助或指导,我会非常高兴。

非常感谢!

这是代码 1:

#include <iostream>
using namespace std;
#include <math.h>
#include <getopt.h>
#include <fstream>
#include <string>

// Returns a pointer-to-pointer to a newly created array
// of size [row : col].
double **Create2D(int row, int col)
{
double **p = new double* [row];
for (int j = 0; j < row; j ++)
p[j] = new double[col];
return p;
}

// Deletes an array pointed by 'p' that has 'row' number rows
void Delete2D(double **p, int row)
{
for (int j = 0; j < row; j ++)
delete [] p[j];
delete [] p;
}

double PDE (double A_old, double A_old2, double dt, double s_int, double m, double ds, double R, double d){
double A_next;
A_next = A_old + dt*(s_int - 1)*m*A_old + (dt/ds)*((s_int-1)*(R*s_int-d)*(A_old2-A_old));
return A_next;
}

// Start of main function

int main(int argc, char *argv[]) {

// Set default values for input

double t(1), m(0.5) , R (1.3) , d (0.8) ;

// Solution by solving PDE for PGF

double dt = 0.0003;
const int tsteps = t/dt +1;
const double ads = 0.01;
const double ds = 0.01;
const int ssteps = 1/ds +1;


// Start Active Section
double **A = Create2D(ssteps, tsteps);

// Initial condition 1: f(s,0) = 1

int i = 0;
for (;i<ssteps;){
A[i][0] = 1;
i++;
}

// Initial condition 2: f(1,t) = 1

int j = 0;
for (;j<tsteps;){
A[ssteps-1][j] = 1;
j++;
}

// Calculate other matrix points
int ii = ssteps-2;
double as_int;
as_int = 1-ads;

for (;ii>=0;){
int jj = 0;
for (;jj<tsteps-1;){
A[ii][jj+1] = PDE (A[ii][jj], A[ii+1][jj], dt, as_int, m, ds, R, d);
jj++;
}
as_int = as_int-ds;
ii--;
}


// Write A to a binary document

ofstream out("valuesA", ios::out | ios::binary);
if(!out) {
cout << "Cannot open file.";
return 1;
}

out.write((char *) &A, sizeof A);

out.close();

ifstream in("valuesA", ios::in | ios::binary);
in.read((char *) &A, sizeof A);

// see how many bytes have been read
cout << in.gcount() << " bytes read\n";

in.close();

// Delete A from the heap to prevent memory leaking
Delete2D(A, ssteps);

return 0;
} // end main

这是代码 2:

#include <iostream>
using namespace std;
#include <math.h>
#include <getopt.h>
#include <fstream>
#include <string>

double **Create2D(int row, int col)
{
double **p = new double* [row];
for (int j = 0; j < row; j ++)
p[j] = new double[col];
return p;
}

// Start of main function

int main(int argc, char *argv[]) {

// Use output of PDE function
double dt = 0.0003;
const int tsteps = t/dt +1;
const double ds = 0.01;
const int ssteps = 1/ds +1;

double **A = Create2D(ssteps, tsteps);

ifstream in("valuesA", ios::in | ios::binary);
in.read((char *) &A, sizeof A);

// see how many bytes have been read
cout << in.gcount() << " bytes read\n";

in.close();

return 0;
} // end main

最佳答案

一个主要问题是:

out.write((char *) &A, sizeof A);

这里写的是 A位置,而不是它指向的数据。此外,由于 A 是一个指针,因此 sizeof A 将是指针的大小,而不是它指向的内容。

您需要明确地循环并保存A 的每个子数组:

for (int i = 0; i < ssteps; ++i)
out.write((char *) A[i], tsteps * sizeof(double));

阅读时反其道而行之。

关于c++ - 将 C++ 结果保存为二进制文件供以后使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49795772/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com