Duvida basica

10 respostas
K

ola amigos estou com uma duvida basica, nesse trecho de codigo.

String buffer = new String();
while ((line = in.readLine()) != null) {
buffer += line + "\n";
StringTokenizer tokens = new StringTokenizer(line);
while ( tokens.hasMoreTokens()){
	  if (tokens.nextToken().equals(inicio) ){
	     while (!(tokens.equals(fim) )) {
	       tokens.hasMoreTokens();
   }
	   }//fim do if 
  }//fim do while

meu problema é q tenho q varrer um arquivo txt, e conto as linhas. e nele to verificando token por token, e comaparo com um caracter qq, se eu encontrar o caracter, ele vai ter inicio e fim, nesse trecho nao conto as linhas. o codigo q faz isso é esse ai em cima so q qdo acho o caracter inicio continuo varrendo a linha e se nao encontro o caracter fim na mesma linha ele entra em loop infinito. e como faço para passar pra proxima linha?

obrigado

10 Respostas

Hayros

depois do segundo While tá tokens.hasMoreTokens();
Vc tá querendo o tokens.nextToken();

K

mas eu tenho q ter esse tokens.hasMoreTokens(); para percorre a linha. o meu problema esta sendo qdo termino de percorre a linha ta dando erro de ponteiro null, pq nao consegue passar para a linha de baixo. é esse o problema.

obrigado

Eduardo_Bregaida

kklj:
mas eu tenho q ter esse tokens.hasMoreTokens(); para percorre a linha. o meu problema esta sendo qdo termino de percorre a linha ta dando erro de ponteiro null, pq nao consegue passar para a linha de baixo. é esse o problema.

obrigado

Deixa eu ver se entendi, vc tem varias linhas e ta contando uma a uma?

K

isso mesmo tenho q contar as linhas mas nao posso contar as q tiver com comentarios do tipo java. entendeu?

Eduardo_Bregaida

Entendi… oq vc pode fazer é ir comparando as linhas se tem // ou // ou / */, vai percorrendo e comparando… se não me engano pelo q entendi isso resolve seu problema.

K

eu to fazendo isso, percorrendo a linha palavra por palavra so q quando chego no fim da linha e nao encontro o */ o sitema da pau

Hayros

O quê eu entendi é o seguinte
VC:
1-> Tem um arquivo de texto com várias linhas onde
2-> Cada linha tem várias “palavras”.
3-> Vc precisa procurar, nas palavras pelos tokens <início> e
4-> checando linha a linha para procurá-los MAS
5-> se o programa não acha os dois na mesma linha cai em loop infinito.

Se for isso, o que vc tem que fazer é o seguinte:

A classe responsável pela leitura do arquivo texto deveria ser
LineNumberReader, pra vc fazer a leitura linha a linha de boua. Vc deveria criar um loop, do tipo

String linha = file1.readLine();

while(linha != null)

{

<código de tratamento>

linha = file1.readLine();

}

esse código de tratamento tem que atentar para os caracteres que te farão descartar as linhas lidas nesse meio tempo. pelo que deu pra entender, eles serão tokens, estando soltos no texto tranquilamente.
Pra procurar eles é só fazer mais ou menos o quê vc estava faznendo, mas vc deveria definir uma variável auxiliar. Uma vantagem da LineNumberReader é que ela permite contar as linhas que se leu. Esse número começa em 0 e aumenta a cada linha, e vc também pode especificar o número da linha. Isso não move o cursor, apenas altera o número da linha, assim, quando formos criar a sua LineNumberReader, vamos criar uma variável auxiliar para ajudar a não contar as linhas.

LineNumberReader file1 = new LineNumberReader(…);
int linenum = 0;

Aí, voltamos ao seu loop:

String linha = file1.readLine();

Boolean ignoring = false;

while(linha != null)

{

StringTokenizer tokens = new StringTokenizer(linha);

String tok = null;

while(tokens.hasMoreTokens())

{

tok = tokens.nextToken();

if(tok ==  && !ignoring)

{

ignoring = true;

linenum = file1.getLineNumber();

}

if(tok ==  && ignoring)

{

ignoring = false;

file1.setLineNumber(linenum);

}

}

linha = file1.readLine();

}

Qual a idéia desse loop?

Ele pega uma linha e começa a varrer procurando por um . Quando ele encontra um desse, armazena o número atual de linhas e liga um boolean, que o ajudará a ignorar outro caractere desse que ele possa encontrar antes de encontrar um . Quando ele acha o , o loop checa se o programa está ou não ignorando as linhas contadas, se estiver ele termina de ignorar, “desligando” o boolean e alterando o número da linha atual, para o daquela na qual ele parou de ignorar. Aí, é só recuperar o número de linhas efetivamente contadas usando um file1.getLineNumber quando terminar de passar o texto.

Eduardo_Bregaida

Hayros:
O quê eu entendi é o seguinte
VC:
1-> Tem um arquivo de texto com várias linhas onde
2-> Cada linha tem várias “palavras”.
3-> Vc precisa procurar, nas palavras pelos tokens <início> e
4-> checando linha a linha para procurá-los MAS
5-> se o programa não acha os dois na mesma linha cai em loop infinito.

Se for isso, o que vc tem que fazer é o seguinte:

A classe responsável pela leitura do arquivo texto deveria ser
LineNumberReader, pra vc fazer a leitura linha a linha de boua. Vc deveria criar um loop, do tipo

String linha = file1.readLine();

while(linha != null)

{

<código de tratamento>

linha = file1.readLine();

}

esse código de tratamento tem que atentar para os caracteres que te farão descartar as linhas lidas nesse meio tempo. pelo que deu pra entender, eles serão tokens, estando soltos no texto tranquilamente.
Pra procurar eles é só fazer mais ou menos o quê vc estava faznendo, mas vc deveria definir uma variável auxiliar. Uma vantagem da LineNumberReader é que ela permite contar as linhas que se leu. Esse número começa em 0 e aumenta a cada linha, e vc também pode especificar o número da linha. Isso não move o cursor, apenas altera o número da linha, assim, quando formos criar a sua LineNumberReader, vamos criar uma variável auxiliar para ajudar a não contar as linhas.

LineNumberReader file1 = new LineNumberReader(…);
int linenum = 0;

Aí, voltamos ao seu loop:

String linha = file1.readLine();

Boolean ignoring = false;

while(linha != null)

{

StringTokenizer tokens = new StringTokenizer(linha);

String tok = null;

while(tokens.hasMoreTokens())

{

tok = tokens.nextToken();

if(tok ==  && !ignoring)

{

ignoring = true;

linenum = file1.getLineNumber();

}

if(tok ==  && ignoring)

{

ignoring = false;

file1.setLineNumber(linenum);

}

}

linha = file1.readLine();

}

Qual a idéia desse loop?

Ele pega uma linha e começa a varrer procurando por um . Quando ele encontra um desse, armazena o número atual de linhas e liga um boolean, que o ajudará a ignorar outro caractere desse que ele possa encontrar antes de encontrar um . Quando ele acha o , o loop checa se o programa está ou não ignorando as linhas contadas, se estiver ele termina de ignorar, “desligando” o boolean e alterando o número da linha atual, para o daquela na qual ele parou de ignorar. Aí, é só recuperar o número de linhas efetivamente contadas usando um file1.getLineNumber quando terminar de passar o texto.

Tá até ai ta certo, mas ele precisa tbm ignorar as linhas de comentarios, dai é só botar uns ifs tipo:

if (var == '/' || var == '/*' || var == '/**'){ //pula a linha } else{ //continua contando }

Não é isso nao?

Hayros

Yah. Eu tava comentando isso com ele depois de ser PMed. Mais eu acho que ele vai ter que usar uns substrings pq NADA garante a ele que vai ter espaço entre, por exemplo a barra dupla, e a primeira letra do comentário.

nicoweda

Você já parou pra pensar se tiver um codigo assim?

/* comentarios do cara mais comentarios do cara*/
o seu codigo ia pular a primeira linha logo no inicio e na segunda linha ele vai pular quando chegar no fim… mas o trecho que vem antes ele vai “interpretar”…
ou

/* comentarios do cara*/ int variavel_super_importante=0;

E neste caso… ele ia pular de linha e perder a declaração da variavel_super_importante.

Dá uma pesquisada em REGEX com certeza deve ter alguma coisa que possa te ajudar…

Sem que você precise perder tempo criando um codigo cheio de IFs…

Abraços

Criado 31 de agosto de 2006
Ultima resposta 4 de set. de 2006
Respostas 10
Participantes 4