Leitura de matriz de um arquivo

Opa, preciso ler uma matriz num arquivo txt e colocar numa variável M[][]. O usuário entra com a as dimensões da matriz txt q vai ser lida.
ex: matriz 3x3

  1   6   5
  8   9   7
  2   3   4

O problema eh q eu leio só q a linha inteira num vetor string… e os espaços vem tbém.

Outra coisa, como faço se o arquivo tiver por exemplo:

  1   6  
  5   2   
  8   9   
  7   4

Como eu leio duas matrizes 2x2 ao invés de uma 4x2 ?

Muito Obrigado.

Na primeira opção vc quer colcocar os numeros respectivamente em casa posicao e isso por exemplo?

Pos(0,0)=1
Pos(0,1)=6
Pos(0,2)=5
Pos(1,0)=8
Pos(1,1)=9
Pos(1,2)=7
Pos(2,0)=2
Pos(2,1)=3
Pos(2,2)=4

Seria isso?

E o seu problema esta sendo extrair isso do arquivo? Vem tudo em uma String e vc quer quebrar respectivamente e isso?

Vc pode fazer um split na String junto com um trim, para tirar os espaços…
Pra ler duas matrizes de 2x2, vc deve ler a primeira de acordo com a entrada do usuário… caso ainda esistam linhas a serem lidas, chame o ciclo de leitura novamente…
Dica: separe o ciclo de leitura da leitura da linha!

Exclareça mais sua duvida esta dificil de saber em exato o que quer…

Oi Toony :wink:

Abaixo há um código que fiz tentando resolver seu problema… Ele parece grande mas é porque está todo comentado, que é pra você entender legal e ver se era isso mesmo que você estava precisando. Se você tirar os comentários, o código fica pequeno :).

Se seu problema era ler um número de cada vez e armazenar cada numero em uma posição de matriz, eu sugeri abaixo que você usasse a classe StringTokenizer.
O rodrigoallemand sugeriu que você fizesse splits; eu não uso por estar acostumada com o StringTokenizer, mas ouvi falar que também é muito bom, ou até melhor :slight_smile:

[quote] Outra coisa, como faço se o arquivo tiver por exemplo:

1 6
5 2
8 9
7 4

Como eu leio duas matrizes 2x2 ao invés de uma 4x2 ? [/quote]
Seja qual for a classe que você estiver usando p/ ler o arquivo, basta que você tenha conrtole sobre o você está lendo. Se você sabe que as matrizes do arquivo são 2x3,por exemplo, entao cada 2 linhas do arquivo correspondem a uma matriz, e cada linha deste arquivo vai ter 3 numeros. Você poderia, então, fazer um for que le duas em duas linhas, e dentro dele um outro for que le três números dessas linhas…

Bom, isso tudo foram apenas sugestões… :slight_smile: Espero que te ajude a chegar aonde você quer, junto com as opiniões que você for recebendo, ok! É assim que a gente aprende :slight_smile:

Boa sorte! :smiley:

[code]/**

  • Le um arquivo com várias matrizes e imprime-as na tela.
  • Primeiramente, cada matriz e armazenada em uma matriz temporária antes
  • de ser impressa. Este procedimento foi adotado para que o programador (você)
  • possa posteriormente realizar algum processamento com os dados desta matriz.
  • Espero que ajude! Boa sorte!
    */

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.File;
import java.util.Scanner;
import java.util.StringTokenizer;

public class LeMatrizArquivo {

/**
 *	Retorna dados de entrada digitados pelo usuario no terminal (DOS, Shell, ...)
 *	@see Scanner
 */
Scanner leEntradaTerminal = new Scanner( System.in );

/**
 *	Classe responsavel pelo leitura do arquivo.
 *	@see BufferedReader
 */
 BufferedReader leArquivo;

/**
 *	StringTokenizer é uma classe muito usada para leitura de arquivos e entradas de texto.
 *	Ela é usada principalmente para ler palavras de uma String. As palavras de uma String 
 *	são	separadas por espaços.
 *	
 *	Por exemplo : 
 *
 *		String frase = "Eu nao mereco isso pra mim!";
 *		StringTokenizer quebraFrase = new StringTokenizer(frase);	// recebe a frase
 *
 *	Com o tokenizer, eu posso imprimir a String frase palavra por palavra:
 *	
 *	while( quebraFrase.hasMoreTokens() ){	// enquanto há mais palavras na String guardada pelo tokenizer:
 *		System.out.println( quebraFrase.nextToken() ); // retorna a próxima palavra da String
 *	}
 *
 *	Este while produziria:
 *
 *	Eu
 *	nao
 *	mereco
 *	isso
 *	pra
 *	mim!
 *
 *	@see StringTokenizer
 */
StringTokenizer leLinhaArquivo;

/** Main.*/
public static void main (String args[]){
	
	new LeMatrizArquivo();
}

/**	Construtor.**/
LeMatrizArquivo(){
	
	leArquivoEImprimeInstancias();	// le o arquivo de matrizes e imprime as matrizes
	
}	

/**	Le o arquivo e cria uma matriz para cada instancia (matriz).
 *	Cada matriz lida é armazenada numa matriz temporaria. Esta
 *	matriz temporaria é impressa para o usuário. Após a impressão, 
 *	o conteúdo da matriz temporária é substituído pela próxima
 *	matriz do arquivo, que por sua vez sera impressa. Este processo
 *	de ler e imprimir matrizes continua até que o arquivo acabe.*/
public void leArquivoEImprimeInstancias() {
	
	// usados para percorrer matriz
	int i, j;
	
	// indica fim de arquivo
	boolean fimArquivo;
	
	// guarda o nome do arquivo
	String nomeArquivo;
	
	// matriz temporaria que recebe todas as matrizes do seu arquivo
	int matriz[][];
	
	// numero de linhas e colunas da matriz
	int N, M;
	
	try {
		// Pede ao usuario o nome do arquivo a ser lido.
		// Exemplo de entrada:  entrada1.txt 
		// (ou seja, pressupoe-se que o arquivo está no mesmo diretorio do programa)
		System.out.print("\n\nEntre com o nome do arquivo: ");
		nomeArquivo = leEntradaTerminal.nextLine(); // le a entrada do usuario no terminal
		
		// Pede ao usuario as dimensoes da matriz
		// Exemplo de entada: 3 3
		System.out.print("\n\nEntre com as dimensoes da matriz: ");
		N = leEntradaTerminal.nextInt(); // le a 1a entrada do usuario no terminal
		M = leEntradaTerminal.nextInt(); // le a 1a entrada do usuario no terminal
		
		// cria matriz temporaria
		matriz = new int[N][M];
		
		// cria classe para ler o arquivo e retornar seu conteudo.
		// voce fornece o nome do arquivo e a classe é criada para ler este arquivo.
		leArquivo = new BufferedReader( new FileReader( nomeArquivo ) );
			
		// Le todas as matrizes do arquivo.
		// Cada matriz é armazenada numa matriz temporária e impressa p/ o usuário.
		int nInstancia = 0;		// informa qual a instancia(matriz) impressa
		String linhaArquivo;	// linha lida do arquivo
		
		fimArquivo = false;
		while( true ) {	// comandos break fazem o while parar quando o arquivo termina
				
			nInstancia++;	// seta o numero da instancia atual
			
			/* Lê a matriz: **************************/
			// as N linhas seguintes do arquivo correspondem as N linhas da matriz:
			for(i = 0; i < M; i++){
				
				linhaArquivo = leArquivo.readLine();	// le uma linha do arquivo (toda a linha)
				if( linhaArquivo == null ){	// se nada for retornado, é porque acabou o arquivo: 
					fimArquivo = true;
					break; // sai do laco "for(i = 0; i < M; i++)"
				}	
				
				leLinhaArquivo = new StringTokenizer(linhaArquivo);	// habilita o tokenizer para ler os componetes de linhaArquivo
				
				// le os M elementos deLinhaArquivo
				for(j = 0; j < M; j++){
					matriz[i][j] = Integer.parseInt( leLinhaArquivo.nextToken());
				}
			}
			
			// La em cima, foi detectado que o arqiuvo acabou. Entao, nenhuma matriz foi armazenada.
			// Nada sera impresso e como nao há mas matrizes , o programa acabou:
			if(fimArquivo)	break; // sai do while
			
			// Senao... Ok. Uma matriz foi lida e armazenada em matriz[][] //
			// Voce pode inserir aqui seu código de processamento de dados em cima de matriz[][], blz? :)
			
			/* Imprime a matriz:*/
			System.out.println("Matriz "+nInstancia);
			for(i = 0; i < N; i++, System.out.println("\n") )
				for(j = 0; j < M; j++)
					System.out.print(matriz[i][j]+" ");
					
			// Ok. Vamos para a próxima instancia! :)
		}
		
		System.out.println("Fim de execucao.");
		
	} catch( Exception erro ) {
		System.out.println("ERRO : " + erro.toString());
	}
}

}[/code]

1 curtida

A classe Scanner praticamente eliminou a necessidade do StringTokenizer. Vários métodos também agora suportam regex e a introdução do método split facilitou as coisas.

No caso de ler uma matriz de um arquivo, também já fiz uma solução que pode ser interessante. Não é tão elegante quanto a da colega, mas é mais simples de entender.

Está em anexo.