Funzione per leggere da file di testo una matrice m x n

di il
12 risposte

Funzione per leggere da file di testo una matrice m x n

Salve ragazzi,come da titolo mi servirebbe una mano con questo tipo di funzione,dove m e n NON sono note.
La funzione che prima usavo quando m e n erano note era questa:

void CaricaMatrice(char NomeFile[],int Matrice[][Max_colonne],int n_riga,int n_colonna)
{ifstream leggi;
leggi.open(NomeFile);
for (unsigned int riga = 0; riga < n_riga; riga++) {
for (unsigned int colonna = 0; colonna < n_colonna; colonna++) {

 
leggi >> Matrice[riga][colonna];
cout << Matrice[riga][colonna] << "\t";
}

cout << endl;
}

leggi.close();

}
int main()
{CaricaMatrice("C:\\Users\\Vittorio\\Desktop\\matrice.txt",Matrice,r,c); // r e c sono due costanti
}
Come si può notare,nel momento della chiamata,sono costretto a dover già conoscere la dimensione della matrice.
Tuttavia a me serve un modo che mi permetta di calcolare la dimensione di essa..
Nei vettori era molto semplice,poichè bastava un ciclo while che leggesse fino alla fine del file,e alla fine di ogni iterazione facevo aumentare una variabile contatore,che mi dava la dimensione.In questo caso però non è possibile poichè le variabili verrebbero aumentate ad ogni elemento della matrice..(e comunque essendo una matrice generica le righe saranno diverse dalle colonne).Avevo pensato ad utilizzare il getline,che mi avrebbe dato senza problemi il numero di righe,con lo stesso procedimento dei vettori,però a quel punto non sarei in grado di capire da quanti elementi è composta una riga...e quindi rimango sempre
bloccato.. :S

12 Risposte

  • Re: Funzione per leggere da file di testo una matrice m x n

    Ciao,
    probabilmente si può fare di meglio, ma una prima idea è quella di contare gli spazi (ammesso che siano spazi, altrimenti i caratteri separatori) contenuti in una riga. Se ci sono N spazi allora ogni riga è composta da N+1 elementi.

    Esempio:
    1_2_3_4
    5_6_7_8

    dove ho evidenziato gli spazi con il carattere '_'. Come vedi ci sono tre spazi, il che significa quattro elementi per riga.
  • Re: Funzione per leggere da file di testo una matrice m x n

    Scusa come faccio a fermarmi dopo aver contato gli elementi di una riga?Il ciclo while continuerà e farà aumentare ancora il contatore
  • Re: Funzione per leggere da file di testo una matrice m x n

    Semplice, non usare il while. Leggi solo una riga.
  • Re: Funzione per leggere da file di testo una matrice m x n

    Nel senso che con il while conto le righe,e poi a parte leggo solo una riga per contare le colonne??
  • Re: Funzione per leggere da file di testo una matrice m x n

    Il while ti serve per leggere le righe ... per le colonne ti basta esaminarne una sola perché sono hanno tutte lo stesso numero di colonne.
  • Re: Funzione per leggere da file di testo una matrice m x n

    Si,quello intendevo con "a parte" xD
  • Re: Funzione per leggere da file di testo una matrice m x n

    Scusate ancora ragazzi,ma prima implementando il codice della funzione,ho realizzato(non so perchè solo ora..xD)che utilizzando getline avrei gli elementi della matrice in stringhe,e quindi non mi sarebbe possibile effettuare operazioni aritmetiche.Quindi sarei costretto ad utilizzare un doppio ciclo for per inserire gli elementi in variabili int...non c'è un metodo più diretto??
  • Re: Funzione per leggere da file di testo una matrice m x n

    Up xD
  • Re: Funzione per leggere da file di testo una matrice m x n

    http://youngmok.com/c-code-for-reading-unknown-size-matrix-from-text-file/

    Qualcuno ha già avuto il tuo problema a quanto pare, prova ad usare anche tu un approccio di questo tipo, eventualmente chiedi se non ti torna qualcosa.
  • Re: Funzione per leggere da file di testo una matrice m x n

    Semplicemente cicli con un while condizionato da fgets che scandisce le righe, per ogni ciclo anni di un secondo ciclo che conta le colonne delimitate dagli spazi.
    Ora che ha la tua matrice di max righe * n colonne allochi la matrice di int, riparti col ciclo identico al primo solo che adesso riempirai il vettore multidimensionale int con l'atoi del token.
    Generalmente un limite fisico esiste sempre è raro dover riciclare.
  • Re: Funzione per leggere da file di testo una matrice m x n

    Scusa la stupidità,ma nn ci ho capito molto,non potresti abbozzare due righe?xD
    Cioè non capisco cosa intendi quando dici "riparti col ciclo identico al primo".
    
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    int const Max_Dim=30;
    
    void CaricaMatrice(char NomeFile[],int M[][Max_Dim],int &n_righe,int &n_colonne)
    {
    
    
    string s[Max_Dim];
    n_righe=0;
    int j=0;
        ifstream leggi;
    leggi.open(NomeFile);
    while(!leggi.eof())
    {
        getline(leggi,s[n_righe]);
        n_righe++;
    }
    leggi.close();
    
    int n_spazi=0;
    
    string x=s[0];
    
    
    while(x[j]!='\0'){
     if (x[j] == ' '  ||    x[j] == '\t'    )
        n_spazi++;
    j++;}
    
    
    n_colonne=n_spazi+1;
    }
    
    int main()
    
    {
        int Matrice[Max_Dim][Max_Dim];
        int n_riga;
        int n_colonna;
    CaricaMatrice("C:\\Users\\Vittorio\\Desktop\\Matrix.txt",Matrice,n_riga,n_colonna);
    }
    
    
    Questo è quello che ho fatto io per contare righe e colonne
  • Re: Funzione per leggere da file di testo una matrice m x n

    Ciao,
    questa è una possibile realizzazione scritta in linguaggio C. Lascio a te l'eventuale traduzione in C++.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    /* Il numero degli elementi in una riga
    e' pari al numero dei caratteri separatori +1 */
    int conta_colonne(char *riga)
    {
    	int i=0, contatore = 0;
    	while(riga[i] != '\0')
    	{
    		if(riga[i] == ' ')
    		{
    			contatore++;
    		}
    		i++;
    	}
    	return (contatore+1);
    }
    
    
    void stampa_matrice(int **matrice, int righe, int colonne)
    {
    	int i, j;
    	for(i=0; i<righe; i++)
    	{
    		for(j=0; j<colonne; j++)
    		{
    			printf("%d  ", matrice[i][j]);
    		}
    		printf("\n");
    	}
    }
    
    
    int main()
    {	
    	size_t dim_riga = 50;
    	
    	int **matrice;
    	int i, j;
    	char *tokens;
    	char delim = ' ';
    	
    	FILE *fp = fopen("file-matrice.txt", "r");
    	
    	int num_righe = 0, num_colonne;
    	char *riga = malloc((dim_riga+1) * sizeof(char));
    	
    	while(getline(&riga, &dim_riga, fp) != -1)
    	{
    		num_righe++;
    	}
    	
    	num_colonne = conta_colonne(riga);
    	
    	printf("Numero di righe: %d\n", num_righe);
    	printf("Numero di colonne: %d\n", num_colonne);
    	
    	/* alloco la matrice con le dimensioni opportune */
    	matrice = malloc(num_righe * sizeof(int *));
    	for(i=0; i<num_righe; i++)
    	{
    		matrice[i] = malloc(num_colonne * sizeof(int));
    	}
    	
    	/* mi riporto all'inizio del file */
    	fseek(fp, 0, 0);
    	
    	i=0;
    	j=0;
    	
    	/* ciclo di lettura e memorizzazione nella matrice */
    	while(getline(&riga, &dim_riga, fp) != -1)
    	{
    		tokens = strtok(riga, &delim);
    		while(tokens != NULL)
    		{
    			matrice[i][j++] = atoi(tokens);
    			tokens = strtok(NULL, &delim);
    		}
    		i++;
    		j=0;
    	}
    	
    	stampa_matrice(matrice, num_righe, num_colonne);
    	
    	fclose(fp);
    	
    	return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
12 risposte