Estou fazendo um trabalho de compiladores. Nessa primeira parte eu tenho que implementar um analisador léxico, e pra isso tenho que ler um arquivo e classificar os tokens.
Preciso ler char por char do arquivo para fazer o tratamento e classificação do que eu ler. Mas não consigo fazer a leitura de um char com o Scanner.
Outra coisa, o scanner lê caracteres especiais como quebra de linha e fim de arquivo?
Deve ser, obrigatoriamente, com a classe Scanner? Você pode fazer isso sem muitos problemas através da classe BufferedReader.
Nunca usei. Sou muito acostumado com o Scanner, acho que é o mais simples, mas se não me satisfaz vou ter que partir pra outro lado.
Me da um exemplo ae entao por favor.
Nunca usei. Sou muito acostumado com o Scanner, acho que é o mais simples, mas se não me satisfaz vou ter que partir pra outro lado.
Me da um exemplo ae entao por favor.[/quote]
Basicamente é isso:
try {
BufferedReader in = new BufferedReader(new FileReader("/home/andre/Arquivo/file.txt"));
char ch;
/* enquanto não achar f */
while ( (ch = (char) in.read()) != 'f'){
System.out.println(ch);
}
in.close();
}
catch (IOException e){
System.out.println(e.getMessage());
}
}
meu arquivo:
abc
def
saída do programa:
[b]a
b
c
d
e[/b]
No caso de uma String é quase a mesma coisa, mas você pode ler o arquivo até chegar em null:
String ch;
while ( (ch = in.readLine()) != null){
System.out.println(ch);
}
public static char proximoChar() throws IOException {
FileReader read = new FileReader(entrada);
BufferedReader reader = new BufferedReader(read);
return (char) reader.read();
}
Deu certinho, porém a cada vez que eu chamo o método, ele sempre me retorna o primeiro caractere. Preciso que a cada vez que eu chame ele me retorne o proximo e assim fosse percorrendo o arquivo.
Como faço?
[quote=Heartbreaker] public static char proximoChar() throws IOException {
FileReader read = new FileReader(entrada);
BufferedReader reader = new BufferedReader(read);
return (char) reader.read();
}
Deu certinho, porém a cada vez que eu chamo o método, ele sempre me retorna o primeiro caractere. Preciso que a cada vez que eu chame ele me retorne o proximo e assim fosse percorrendo o arquivo.
Como faço?[/quote]
É porque você só leu o primeiro caractere. Você deve percorrer, de acordo com a posição, e passar o valor para uma variável. Por exemplo:
char ch = 0;
for (int i = 0; i < 2; i++){
ch = (char) in.read();
}
System.out.println(ch);
Saída:
b
Ou seja, imprimiu o segundo caractere do meu arquivo.
Desculpa se estou sendo grosso mas isso ta me parecendo uma baita gambiarra rsrsrs.
Pq quando eu for ler o milésimo caractere do arquivo, eu vou ter que ler 999 antes de retornar o que eu quero.
[quote=Heartbreaker]Desculpa se estou sendo grosso mas isso ta me parecendo uma baita gambiarra rsrsrs.
Pq quando eu for ler o milésimo caractere do arquivo, eu vou ter que ler 999 antes de retornar o que eu quero.[/quote]
Eu não sei se em Java é possível ir diretamente à uma determinada posição no arquivo, mas dessa forma não me parece uma gambiarra. Você teria de por um contador em seu programa e for() percorreria de acordo com valor do contador.
tenho uma sugestão talvez isso te ajude:
[code]private static int index = 0;
public static String ler() throws IOException {
FileReader read = new FileReader(entrada);
BufferedReader reader = new BufferedReader(read);
String str = "";
String line = reader.readLine();
while (line != null) {
str += (line + "\n");
}
return str;
}
public static char proximoChar() throws IOException {
char[] chars = ler().toCharArray();
char ch = chars[index];
index++;
return ch;
}[/code]
o metodo ler() irá ler seu arquivo por completo e retornar uma String ai com o metodo proximoChar() ele vai retornar o char do indice da array de chars interna esse indece é um global amazanado na classe.
espero que ajude até mais
tentei dar um println na str pra ver se imprimia e nada…
Tenho a msma dúvida, como faço para contar qntos caracteres tem na variável Stringw
Por favor poste o seu código para que eu possa analizar e ver qual o problema, ate +
Crie um tópico com a sua dúvida, para inicio de conversa.
String texto = "Linguagem Java";
int qtdeChar = texto.length();
System.out.print(qtdeChar); // Saída: 14
abra um tópico mais basicamente acredito que seria:
String str = "palavra";
System.out.println(str.toCharArray().length);
que tem saida o número 7
pelo que entendi é isso que você quer GUICS
Valew galera ficou assim:
public static void leArquivo() throws IOException {
FileReader read = new FileReader(entrada);
BufferedReader reader = new BufferedReader(read);
StringBuilder string = new StringBuilder();
Character c;
int i = reader.read();
if (EOF(i)) {
JOptionPane.showMessageDialog(null, "Arquivo Vazio");
System.exit(0);
}
do {
c = (char) i;
string.append(c);
i = reader.read();
} while (!EOF(i));
chars = string.toString().toCharArray();
}
public static Character proximoChar() {
try {
return chars[index++];
} catch (ArrayIndexOutOfBoundsException e) {
return Character.PRIVATE_USE;
}
}
Problema resolvido?
[code]
String texto = "Linguagem Java";
int qtdeChar = texto.length();
System.out.print(qtdeChar); // Saída: 14
[/code][/quote]
Valeu, tirou minha duvida amigo.