Matrice quadrata da file

di il
6 risposte

Matrice quadrata da file

Salve ragazzi ho il seguente problema: devo prendere da file un vettore e trasformarlo e stampare a video la matrice quadrata.

ES:
file:
123456789

video:
123
456
789

posto il mio codice (mi stampa come se fosse un vettore)
#include<iostream>
#include<cstdlib>
#include<fstream>
#include<math.h>

#define N 50
#define M 50

using namespace std;

int main ()

{
	int r=0;
	int c=0;

	int mat[N][M];	

	
	
	ifstream file;
	file.open("file.txt", ios::in);
	
	if(!file)
	{
		cout<<"\nErrore apertura file!";
		exit(1);
	}
	
	while(!file.eof())
	{
	  file>>mat[r][c];
	  r++;
	  c++;
	}
	
	for(int i=0; i<sqrt(r); i++)
	{
		for(int j=0; j<sqrt(c);j++)
		{
			cout<<mat[i][j];
			
		}
		
	}

   
}

6 Risposte

  • Re: Matrice quadrata da file

    Non ho capito.. il tuo problema è solo che ti stampa gli elementi tutti uno dietro l'altro?
    Semplicemente inserisci un a-capo alla fine di ogni riga..
     for(int i=0; i<sqrt(r); i++){
        for(int j=0; j<sqrt(c);j++)
            cout<<mat[i][j];
        cout << endl;
    }
    Altra cosa... se la matrice è quadrata, è inutile salvarti il numero di righe e colonne, ne basta uno. Piuttosto che definire N e M utilizzane solo una; stessa cosa per r e c.


    Edit: Il metodo di inserimento è sbagliato. Per come fai tu, i valori vengono inseriti solo nelle posizioni (0, 0), (1, 1), e così via.
    Prima conti il numero di elementi all'interno del file, ne fai la radice quadrata, e conosci quindi l'ordine della matrice.
    Successivamente passi al riempimento della matrice col solito doppio ciclo for.
  • Re: Matrice quadrata da file

    tuixte ha scritto:


    Non ho capito.. il tuo problema è solo che ti stampa gli elementi tutti uno dietro l'altro?
    Semplicemente inserisci un a-capo alla fine di ogni riga..
     for(int i=0; i<sqrt(r); i++){
        for(int j=0; j<sqrt(c);j++)
            cout<<mat[i][j];
        cout << endl;
    }
    Altra cosa... se la matrice è quadrata, è inutile salvarti il numero di righe e colonne, ne basta uno. Piuttosto che definire N e M utilizzane solo una; stessa cosa per r e c.


    Edit: Il metodo di inserimento è sbagliato. Per come fai tu, i valori vengono inseriti solo nelle posizioni (0, 0), (1, 1), e così via.
    Prima conti il numero di elementi all'interno del file, ne fai la radice quadrata, e conosci quindi l'ordine della matrice.
    Successivamente passi al riempimento della matrice col solito doppio ciclo for.
    Giusto, ora ci provo e riposto il codice, grazie per l'aiuto.
  • Re: Matrice quadrata da file

    Scusami non riesco a capire il problema :/
    	while(!file.eof())
    	{
    	  file>>mat[r][r];
    	  r++;
    	  
    	  
    	  
    	}
        
        n=sqrt(r);
        
        for(int i=0; i<n; i++)
        {
        	for(int j=0; j<n; j++)
        	{
        		cout<<mat[i][j];
        	}
        	cout<<endl;
        }
  • Re: Matrice quadrata da file

    Come ti ho detto in precedenza, il problema sta nel riempimento nella matrice.
    Guarda il tuo codice:
    while(!file.eof()){
         file>>mat[r][r];
         r++;
    }
    All'inizio r = 0, dunque scrivi in mat[0][0], il che è corretto; poi incrementi r, dunque r = 1. A questo punto, quando vai a scrivere la matrice, scrivi in mat[1][1], il che è sbagliato: la posizione corretta su cui scrivere è mat[0][1] (riga 0, colonna 1).

    Pertanto, prima conti gli elementi della matrice, poi la popoli (sempre che tu non li sappia a priori). In pratica, una cosa del genere:
    /* Conto gli elementi */
    int count = 0;
    int temp;
    while(!file.eof()){
        file >> temp;
        count++;
    }
    
    int n = sqrt(count); // l'ordine della matrice
    
    /* Inserisco gli elementi nella matrice */
    file.seekg(0); // Mi pongo all'inizio del file
    for(int row = 0; row < n; row++)
        for(int col = 0; col < n; col++)
            file >> mat[row][col];
    Ovviamente, se non devi fare altre operazioni, puoi benissimo stampare la matrice all'interno di quello stesso ciclo for, senza crearne un altro. Per ottimizzare ancora di più, se il tuo scopo è solo quello di stampare gli elementi del file, puoi anche evitare di creare del tutto la matrice ed utilizzare una singola variabile temporanea.. ma ripeto, questo dipende da cosa devi fare.


    P.s.: sarebbe inoltre corretto inserire un controllo sulle dimensioni del file (se n >= N) dove N è quello da te definito ad inizio codice, stampa un messaggio d'errore.
  • Re: Matrice quadrata da file

    Perfetto grazie, ovviamente i controlli vanno messi ma mi serviva capire solo come si leggeva
  • Re: Matrice quadrata da file

    Di nulla
Devi accedere o registrarti per scrivere nel forum
6 risposte