Re: [lua-br] Dúvida io.read()

570 views
Skip to first unread message

Elias Barrionovo

unread,
Aug 27, 2012, 1:10:44 AM8/27/12
to lua...@googlegroups.com
2012/8/23 Ricardo <nabe...@gmail.com>:
> Porque um io.read("*number") seguido por um io.read(), o segundo io.read é
> ignorado? Por exemplo:

Não tenho certeza, mas me parece que quando o primeiro io.read() lê um
número, ele deixa no buffer o '\n', que então é lido pelo segundo
io.read().

--
NI!

Ricardo

unread,
Aug 29, 2012, 12:23:57 PM8/29/12
to lua...@googlegroups.com
   Concordo, acho que é o que aconteceu mesmo..

   Estranho o io.read() consumir o token '\n' (ou outro que tenha sido gerado pelo <enter>),
pois entre o <enter>  e o io.read() há outras coisas  sendo feitas, como um io.write.

   Confesso que estou no início dos estudos com Lua mas quando vejo essas coisas desanimo um pouco, hehe. 

   Obrigado!

BRUNO ROCHA

unread,
Sep 3, 2012, 2:40:18 PM9/3/12
to lua...@googlegroups.com
 
    Em linguagem c acontece o mesmo fenômeno com estrutura na leitura de strings, 
    sempre após a leitura do buffer de entrada é necessário limpar o buffer,
    o que ocorre é que o caracter de leitura do enter acaba sujando o buffer na segunda
 
    leitura,  é necessário realizar uma descarga do buffer de entrada
   (em c  fflush( stdin ) ), em lua alguém aí vai me ensinar.


Date: Wed, 29 Aug 2012 09:23:57 -0700
From: nabe...@gmail.com
To: lua...@googlegroups.com
Subject: Re: [lua-br] Dúvida io.read()

Eric Chiesse

unread,
Sep 3, 2012, 5:36:27 PM9/3/12
to lua...@googlegroups.com
fflush(stdin) é algo estranho. Dá uma pesquisada no Google e vê o que o pessoal fala a respeito.

No mínimo não é portável.

Pode começar olhando o seguinte: http://pubs.opengroup.org/onlinepubs/009696799/functions/fflush.html

Saudações

---
Eric
br.linkedin.com/in/echiesse

sw...@zipmail.com.br

unread,
Sep 16, 2012, 4:39:10 PM9/16/12
to lua...@googlegroups.com
Olá, Ricardo.
 
Existe uma questão funcional em microcomputadores. O buffer do teclado. É comum ocorrer uma falha operacional quando da entrada de dados alfabéticos ou alfanuméricos. O problema é o seguinte quando se faz uma entrada de valor numérico e aciona-se a tecla <Enter>, este <Enter> faz duas coisas, retorna o cursor para a posição inicial da linha e muda o cursor. Ao fazer esta ação o buffer (memória) do teclado é limpo e fica disponível para outra entrada. No entanto quando se faz a entrada de um valor alfabético ao alfanumérico não ocorre a limpeza do buffer após o acionamento da tecla <Enter> o que gera o erro relatado por você.
 
Este efeito desastroso não é culpa da linguagem Lua e sim do computador, pois a mesma ocorrência é registrada em outras linguagens como Pascal, C, entre outras. Por exemplo, na linguagen Pascal o efeito é neutralizado quando se usa tanto para entrada numéricas como alfanuméricas a instrução readln(). No caso da linguagem C usa-se após as entradas a função fflush(stdio).
 
Assim sendo é melhor fazer a entrada numérica primeiro e a alfanumérica em seguida. Ainda não descobri como fazer na linguagem Lua a limpeza do buffer do teclado.
 
 

A*e

SW-Fly




Em 23/08/2012 22:18, Ricardo < nabe...@gmail.com > escreveu:
  Caros, 
 
  Primeiramente, desculpem-me pela dúvida iniciante. 
 
  Porque um io.read("*number") seguido por um io.read(), o segundo io.read é ignorado? Por exemplo:
 
  io.write("\nDigite uma palavra: ")
  palavra = io.read()
  io.write("\nPalavra digitada: ",  palavra) 
 
  io.write("\nDigite um numero: ")
  numero = io.read("*number")
  io.write("\nNumero digitado: ",  numero)
 
  Nesse exemplo, os dois io.read() consomem o que é digitado. Porém, se inverter a ordem:
 
  io.write("\nDigite um numero: ")
  numero = io.read("*number")
  io.write("\nNumero digitado: ",  numero)
 
  io.write("\nDigite uma palavra: ")
  palavra = io.read()
  io.write("\nPalavra digitada: ",  palavra) 
 
  O processamento nâo pára para ler o segundo io.read(). 
 
  Alguém poderia me dizer o porquê?
 
  Obrigado antecipadamente,  
 
 
 
 

Ricardo

unread,
Sep 17, 2012, 4:13:19 PM9/17/12
to lua...@googlegroups.com
   
  Olá SW-Fly!

  Muito obrigado a você, ao Elias, e aos demais pela atenção, assunto esclarecido! 
  
  []'s!!

Andrws Vieira

unread,
Apr 1, 2013, 1:28:16 PM4/1/13
to lua...@googlegroups.com
Olá, pessoal,


Alguém acho uma solução para este caso ???
Estou com o mesmo problema, eu tentei utilizar io.flush() 
mas também não funcionou.

[]'s

--
Andrws Aires Vieira         
Mestrando em Computação
Universidade Federal do Rio Grande do Sul - UFRGS

Elias Barrionovo

unread,
Apr 1, 2013, 2:15:38 PM4/1/13
to lua...@googlegroups.com
2013/4/1 Andrws Vieira <andrws...@gmail.com>
> Alguém acho uma solução para este caso ???
> Estou com o mesmo problema, eu tentei utilizar io.flush()
> mas também não funcionou.

flush() não vai funcionar: ele serve para você *escrever* no arquivo
(stdout e stderr também são arquivos) o que ainda está em buffer.
Apesar do nome, ele não serve para limpar o buffer de leitura.

O que você deve fazer é um io.read() depois do io.read '*n'.

De qualquer forma, eu prefiro sempre ler linha a linha e depois
converter explicitamente para número, justamente para evitar esse tipo
de problema:

num = tonumber(io.read()) -- se não tiver mais nada na linha além de
espaços e o número

num = tonumber(io.read():match"%d+") -- se tiver mais alguma coisa
além do número e espaços

nums = {}
for n in io.read():gmatch "%d+" do -- se você quiser ler mais de um
número por linha.
nums[#nums+1] = tonumber(n)
end

--
NI!

Andrws Vieira

unread,
Apr 1, 2013, 2:24:09 PM4/1/13
to lua...@googlegroups.com
Obrigado pelas dicas Elias, certamente irei usa-las.


Abraços.


--
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para lua-br+un...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.


Reply all
Reply to author
Forward
0 new messages