Como faço para ler caracter a caracter de um arquivo.txt?

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…

Se vai construir um compilador, veja a classe PushbackReader

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…