/*filematrice1.cpp*/

// Salvataggio e caricamento di una matrice in un file
// in modalità testo (operatori di estrazione e inserimento)

#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à testo del numero di righe e di colonne
// (notare la necessità di separare i dati esplicitamente)
f << A.R << ' ' << A.C << endl;

// Scrittura degli elementi contenuti nel vettore
for ( int i = 0; i < A.R*A.C; i++ )
f << A.p[i] << endl;
}

/*********************************************
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
// NOTA BENE: gli spazi di separazione vegono automaticamente saltati
f >> A.R >> A.C;

// 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 dei valori da scrivere nel vettore
for ( int i = 0; i < A.R*A.C; i++ )
f >> A.p[i];
}