/*filematrice2.cpp*/

// Salvataggio e caricamento di una matrice in un file
// in modalità binaria (funzioni read e write)

#include <iostream>
#include <fstream>
#include "matrici.h"

using namespace std;

/*********************************************
Salvataggio di una matrice in un file

Parametri:

A: matrice (passata per riferimento)
nomefile: stringa contenente il nome del file in cui salvare la matrice

La matrice passata alla funzione deve essere già stata creata e riempita.
*/
void scrivimatrice (matrice &A, char *nomefile)
{
// Apertura del file in scrittura e sua associazione allo stream f
ofstream f (nomefile);

// Controllo: se lo stream non è valido, segnala errore
if ( !f ) {
cout << "Errore nell'apertura del file " << nomefile << endl;
return;
}

// Scrittura in modalità binaria del numero di righe e di colonne
f.write ((char*)&(A.R), sizeof(int));
f.write ((char*)&(A.C), sizeof(int));

// Scrittura degli elementi contenuti nel vettore
f.write ((char*)A.p, A.R*A.C*sizeof(double));
}

/*********************************************
Lettura di una matrice da un file

Parametri:

A: matrice (passata per riferimento)
nomefile: stringa contenente il nome del file in cui salvare la matrice

La matrice passata alla funzione deve essere vuota
(il vettore p non dev'essere già stato allocato);
il file dal nome contenuto in nomefile deve esistere
*/
void leggimatrice (matrice&A, char *nomefile)
{
// Apertura del file in scrittura e sua associazione allo stream f
ifstream f (nomefile);

// Controllo: se lo stream non è valido, segnala errore
if ( !f ) {
cout << "Errore nell'apertura del file " << nomefile << endl;
return;
}

// Lettura del numero di righe e di colonne
f.read ((char*)&(A.R), sizeof(int));
f.read ((char*)&(A.C), sizeof(int));


// Una volta noto il numero di righe e di colonne,
// viene allocato il vettore di double
A.p = new double [A.R * A.C];

// Estrazione dal flusso del contenuto del vettore
f.read ((char*)A.p, A.R*A.C*sizeof(double));
}