Entrada de Dados
Conceito
Seção intitulada “Conceito”A função toma lê uma linha da entrada padrão (stdin) e devolve-a como textu. Pode receber uma mensagem, que é escrita antes da leitura para dizer ao utilizador o que escrever.
toma é uma função embutida do prelúdio: está sempre disponível, mas o nome é reservado e não pode ser redefinido.
Sintaxe
Seção intitulada “Sintaxe”toma()toma("Mensagem para o utilizador: ")tenta toma() // passa o erro adiante (função com `: Erru`)toma() sinon "" // valor por omissãotomaaceita no máximo um argumento, e esse argumento tem de sertextu.- A mensagem é escrita tal como está, sem quebra de linha, e a saída é despejada antes da leitura, por isso aparece sempre antes de o programa esperar pela entrada.
- Cada chamada lê exatamente uma linha. O valor devolvido não inclui a quebra de linha final; em ficheiros com quebras de linha Windows, o
\rfinal também é removido. - Uma linha vazia é lida como
"". Só falha uma leitura sem nenhum dado, depois de a entrada acabar. - Uma última linha sem quebra de linha é lida normalmente.
tomadevolve sempretextu. Para obter um número ou umbool, converte o texto comtipo::konverti(vê Ler números).
Quando a leitura falha
Seção intitulada “Quando a leitura falha”Ler pode falhar: a entrada pode ter terminado ou pode não ser possível lê-la. toma falha então com um Erru cuja mensagem é a entrada terminou e não há mais linhas para ler ou não foi possível ler a entrada.
A entrada termina quando o ficheiro redirecionado chega ao fim, ou quando o utilizador a fecha no terminal: Ctrl+D em Linux e macOS, ou Ctrl+Z seguido de Enter no início de uma linha na consola do Windows.
Podes tratar a falha (vê Erros), ou não fazer nada:
toma()sozinho termina o programa comprograma.kriol:N: erro não tratado: a entrada terminou e não há mais linhas para lerse a entrada acabar. É o mais simples, e adequado para programas curtos.tenta toma()passa o erro a quem chamou, por isso só se usa numa função que declare: Erru.toma() sinon "valor"usa um texto por omissão quando a leitura falha.
Ler números
Seção intitulada “Ler números”Lê primeiro o texto numa linha e converte-o na seguinte, com tipo::konverti (vê Conversão de tipos). Os espaços no início e no fim do texto são ignorados na conversão.
fn inisiu() : Erru { textu entrada_idadi = tenta toma("Idadi: "); int idadi = tenta int::konverti(entrada_idadi); mostran(f"Para o ano terás {idadi + 1}.");}Se o utilizador escrever algo que não é um número, int::konverti falha com um erro como 'abc' não é um número inteiro válido. Para voltar a pedir o valor, usa sinon num ciclo:
fn inisiu() { int idadi = -1; nkuantu idadi < 0 { textu entrada_idadi = toma("Idadi: "); idadi = int::konverti(entrada_idadi) sinon -1; } mostran(f"Idadi: {idadi}");}O valor impossível -1 marca “ainda não tenho resposta válida”, e o ciclo repete-se até ter uma.
Exemplos
Seção intitulada “Exemplos”Leitura de string
Seção intitulada “Leitura de string”fn inisiu() { textu nome = toma("Digite o seu nome: "); mostran(f"Olá, {nome}!");}Valor por omissão se a entrada acabar
Seção intitulada “Valor por omissão se a entrada acabar”fn inisiu() { textu nome = toma("Digite o seu nome: ") sinon "visitanti"; mostran(f"Olá, {nome}!");}Vários valores, um por linha
Seção intitulada “Vários valores, um por linha”fn inisiu() : Erru { textu entrada_a = tenta toma("Primeiro númeru: "); num a = tenta num::konverti(entrada_a);
textu entrada_b = tenta toma("Segundo númeru: "); num b = tenta num::konverti(entrada_b);
mostran(f"{a} + {b} = {a + b}");}Vários valores num ciclo
Seção intitulada “Vários valores num ciclo”Quando o número de valores é conhecido, lê-os num pa:
fn inisiu() : Erru { int total = 0;
pa int i = 0; i < 3; i += 1 { textu linha = tenta toma(f"Valor {i + 1}: "); total += tenta int::konverti(linha); }
mostran(f"Total: {total}");}Correr com um ficheiro em vez do teclado
Seção intitulada “Correr com um ficheiro em vez do teclado”Qualquer programa que use toma também aceita as linhas de um ficheiro, sem mudar uma linha de código. No terminal, usa < para redirecionar a entrada:
kriol soma.kriol -o somaprintf '10\n20\n30\n' > dados.txt./soma < dados.txtValor 1: Valor 2: Valor 3: Total: 60As mensagens aparecem seguidas porque ninguém escreve entre elas. É a forma mais prática de testar um programa interativo muitas vezes, e também funciona com um pipe: printf '10\n20\n30\n' | ./soma.
Limitações atuais
Seção intitulada “Limitações atuais”- Cada chamada lê uma linha inteira: ainda não há forma de ler vários valores numa só linha, nem um carácter de cada vez. Se precisares de dois números, pede-os em duas linhas.
- Não há leitura de ficheiros; só a entrada padrão, eventualmente redirecionada de um ficheiro pelo terminal.
- Não há forma de saber de antemão se há mais entrada para ler: descobres ao tentar, e a leitura falha com um
Erru.