Preciso saber omo faço para ler caracter a caracter de um arquivo.txt.
Tentei usando o método read(), mas ele retorna um inteiro e não estou conseguindo converter esse inteiro para o caracter correspondente.
Alguém pode me ajudar?
Faz um cast pra caracter!
(char)read()
Não funcionou!
Olha o trecho do código:
[/code] char caracter;
do{
caracter =(char) leitor.read();
System.out.println("Caracter: " + caracter );
}
while(caracter != '\0');
System.out.println("Fim do arquivo");
O resultado da execução é um loop infinto:
Caracter: ?
Caracter: ?
Caracter: ?
Caracter: ?
Caracter: ?
Caracter: ?
Caracter: ?
Caracter: ?
Caracter: ?
Caracter: ?
Caracter: ?
Caracter: ?
Caracter: ?
Caracter: ?
Caracter: ?
Caracter: ?
Caracter: ?
Caracter: ?
Caracter: ?
…
Não esqueça de fazer isso usando um BufferedReader.
Ler caracter a caracter de verdade num .txt é uma operação muitíssimo ineficiente.
Eu nao sei se é isso…
mas tenta ai javascript:emoticon(’:lol:’);
public class LeArquivoTxt {
public static void main(String[] args) throws IOException {
File file = new File("C:\\arquivo.txt");
FileReader reader = new FileReader(file);
BufferedReader Linha = new BufferedReader(reader);
while(Linha.readLine() != null){
String le = Linha.readLine();
System.out.println(le);
}
}
}
Eu to usando o BufferedReader sim.
Então, mas eu preciso ler caracter a caracter porque vou precisar para construir um compilador.
Talvez seria melhor se eu pudesse ler palavra a palavra.Mas não sei como faze-lo.
Alguém sabe?
Não é isso C3, assim é linha a linha. Mas valeu!
Cara essa coisa de ‘\0’ é coisa de C.
Para ler caractere um a um o melhor é fazer o que o vinícius disse…
Passa um bloco de 1024, por exemplo, em um array, e depois vc le do array… Assim é mais eficiente
Cara no meu projeto de Compiladores eu fiz um esquema de dois bufferes, que o professor tinha falado que era bem eficiente…
A classe que tratava os bufferes é esta que eu vou te passar…
Boa sorte!!
/*
* Buffer.java
*
* Buffer de entrada do compilador. É um esquema de buferização
* dupla que agiliza e facilita a operação da compilação e análise
* léxica.
*/
package Estrutura;
import java.io.FileReader;
public class Buffer {
/* Atributos de Buffer */
private char[] b1, b2;
private String filepath;
private int pos; // Variável para guardar a pos do arquivo
private int b; // Qual buffer está sendo usado (1 ou 2)
private int pos_buffer;
/* Construtor de Buffer */
public Buffer(String _filepath) {
b1 = new char[4096];
b2 = new char[4096];
b1[0] = b2[0] = '\0';
filepath = _filepath;
pos = 0;
b = 1;
pos_buffer = 0;
carregaBuffer(1);
}
/* Carrega buffers com o arquivo. */
/* Op=1, buffer1, Op=2, buffer2 e Op=3, os dois buffers */
public void carregaBuffer(int op)
{
try
{
FileReader fread = new FileReader(filepath);
int nchar;
switch(op)
{
case 1:
nchar = fread.read(b1,pos,4096);
if( nchar != 4096 )
b1[nchar] = '$'; // Fim do arquivo
pos += nchar;
break;
case 2:
nchar = fread.read(b2,pos,4096);
if( nchar != 4096 )
b2[nchar] = '$'; // Fim do arquivo
pos += nchar;
break;
default:
System.out.println("Operação inválida. Método carregaBuffer");
}
fread.close();
}
catch(Exception e)
{
System.out.println("Erro na abertura do arquivo.\n" + e.getMessage());
b1[0] = '$'; // Para exceção de arquivo vazio;
}
}
public char getNext()
{
char returned;
if( b == 1 )
returned = b1[pos_buffer];
else
returned = b2[pos_buffer];
if( pos_buffer < 4095 )
pos_buffer++;
else
{
pos_buffer = 0;
if( b == 1 )
b = 2;
else
b = 1;
carregaBuffer(b);
}
return returned;
}
public void walkBack()
{
if( pos_buffer == 0 )
{
if( b == 1 )
b = 2;
else
b = 1;
pos_buffer = 4095;
}
else
pos_buffer --;
}
}
Muito obrigado!
tem que ser em java?
existem ai os compiladores de compiladores… de uma pesquisada no JavaCC, mto bom… (ele ja faz o analisador léxico e sintatico, enqunto todos os outros que encontrei ou fazem um, ou outro, tendo que trabalhar em dupla…basicamente no léxico por exemplo, vc passa pra ele uma expressão regular e ele intende o que que é o que…)
tem um livro a respeito, chamado como construir um compilador usando ferramentas java (ou algo assim)
quando eu tava fazendo um analisador léxico no passado (ia usar no meu tcc, mais cabei usando o JavaCC),
no passado eu cheguei a fazer um analisador léxico querendo como linguagem uma implementação de portugues estruturado… BufferedReader não tem algum readChar, por isso eu te indico usar o readLine e depois disso ir vendo caractere a caractere usando substring, chatAt() de String ou coisa do tipo.
uma coisa em relação a lógica que foi preferencia minha, foi ao inves de ir formando a palavra lendo caractere a caractere, procurar a proxima ocorrencia de algum caractere que determine que terminou o token…
um exemplo mais facil de intender seria dizer que a palavra vai do inicio até o indexof() de \n, ou de " " (espaço) ou de + - * ou / … caracteres que significam que a palavra terminou…
aa32bb é a mesma palavra, aa.32bb não (no caso ai pegaria o indexOf do ponto…)
eu achei mais facil isso do que ir concatenando a ultima string lida… não olhava caractere a caractere…
depois de definida palavra, eu pegava um inteiro Inicio definido pra saber onde que tava o indice docomeço da palavra no substring e colocava logo em seguidado final dela (no casoo caractere que diz que a palavra termino)…
vc teria ai uns problemas ainda tipo 2 espaços seguidos, tendo que re-direciona o inicio para 1 a mais…
é por essas e outras que termina o lexico foi questão de honra… mais depois disso eu usei um compilador de compiladores…
Estude tbm o StringTokenizer do Java… é uma mão na roda… heheheh
E qual o problema de ser em Java?
Aliás, se fosse para ele pegar algo mais ou menos pronto, poderia pegar o antlr.
Mas eu concordo com o Thingol. Se for fazer no braço, usa o PushBack reader.
E estuda direito a teoria do analisador léxico. Lá já ensinam direitinho a como separar os tokens que vc está lendo (uma das técnicas é fazendo um autômato finito, por exemplo).
E qual o problema de ser em Java?
Aliás, se fosse para ele pegar algo mais ou menos pronto, poderia pegar o antlr.
Mas eu concordo com o Thingol. Se for fazer no braço, usa o PushBack reader.
E estuda direito a teoria do analisador léxico. Lá já ensinam direitinho a como separar os tokens que vc está lendo (uma das técnicas é fazendo um autômato finito, por exemplo).[/quote]
não sei se me espressei mal…ser em java não é um problema… perguntei se é em java pq uma coisa facilita no uso do JavaCC, é que além do código dele mesmo para gerar o compilador com suas ERs, e etc… ele tb aceita código java no fonte que diz como serão os analisadores…