3 votes

Enregistrer le résultat C++ dans un fichier binaire pour une utilisation ultérieure

Je suis en train d'écrire un programme C++ qui résout une EDP et enregistre la solution dans un tableau 2D. Ensuite, il fait quelque chose avec les résultats de cette EDP. Cependant, résoudre l'EDP avec précision nécessite beaucoup de calculs. Ainsi, la partie résolution doit être exécutée une seule fois, mais les résultats doivent être enregistrés, de sorte que je puisse y revenir plus tard.

Par conséquent, j'ai écrit deux codes différents:

  1. résout l'EDP et enregistre les résultats dans la matrice A. La matrice A est enregistrée dans un fichier binaire.

  2. lit les valeurs dans le fichier binaire et effectue des calculs avec les résultats.

Cependant, lorsque je lis le fichier binaire dans le deuxième code, il contient seulement un tableau vide et ne contient pas les valeurs que j'ai enregistrées ici dans l'autre code.

Si je le lis dans le code 1, il fonctionne comme désiré.

Qu'est-ce que je fais de mal? Est-il même possible de lire les valeurs d'un fichier binaire dans une autre application? Dois-je aborder ce problème complètement différemment?

J'ai enregistré les deux codes dans un projet différent, dois-je les relier d'une certaine manière? Ou les deux codes doivent-ils être dans le même projet?

J'ai passé quelques jours à chercher une solution sur le web, mais je ne trouve que des questions et des réponses sur la manière d'ouvrir et d'enregistrer des fichiers binaires dans le même code (par exemple ceci et cela). Est-ce que cela signifie que ce que j'essaie de faire n'est pas possible ou n'ai-je pas trouvé les bonnes sources?

Je suis un complet débutant en C++ et serais très heureux de toute aide ou direction.

Merci d'avance!

Voici le code 1:

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

// Retourne un pointeur sur un tableau nouvellement créé de taille [ligne : colonne].
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;
}

// Supprime un tableau pointé par 'p' ayant 'row' nombre de lignes
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;
}

// Début de la fonction principale

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

    // Définir des valeurs par défaut pour l'entrée

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

    // Solution en résolvant l'EDP pour le 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;

    // Démarrer la section active
    double **A = Create2D(ssteps, tsteps);

    // Condition initiale 1: f(s,0) = 1

    int i = 0;
    for (;i

`Voici le code 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;
}

// Début de la fonction principale

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

    // Utiliser la sortie de la fonction PDE
    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);

    // voir combien d'octets ont été lus
    cout << in.gcount() << "octets lus\n";

    in.close();

    return 0;
} // fin main`

7voto

Joachim Pileborg Points 121221

Un problème majeur est le suivant:

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

Ici, vous écrivez l'emplacement de A, pas les données auxquelles il pointe. De plus, puisque A est un pointeur, alors sizeof A sera la taille du pointeur et non de ce qu'il pointe.

Vous devez boucler et sauvegarder chaque sous-tableau de A explicitement:

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

Faites l'opposé lors de la lecture.

1voto

schorsch312 Points 2628

Je pense que votre problème est résolu par @SomeProgrammerDude, mais je suggère de jeter un œil à boost serialization.

Ainsi, vous pouvez facilement écrire et lire l'état d'objets complets et vous n'avez pas à inventer votre propre représentation binaire de vos données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X