Pular para o conteúdo

Entrada de Dados

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.

toma()
toma("Mensagem para o utilizador: ")
tenta toma() // passa o erro adiante (função com `: Erru`)
toma() sinon "" // valor por omissão
  • toma aceita no máximo um argumento, e esse argumento tem de ser textu.
  • 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 \r final 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.
  • toma devolve sempre textu. Para obter um número ou um bool, converte o texto com tipo::konverti (vê Ler números).

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 com programa.kriol:N: erro não tratado: a entrada terminou e não há mais linhas para ler se 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.

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.

fn inisiu() {
textu nome = toma("Digite o seu nome: ");
mostran(f"Olá, {nome}!");
}
fn inisiu() {
textu nome = toma("Digite o seu nome: ") sinon "visitanti";
mostran(f"Olá, {nome}!");
}
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}");
}

Quando o número de valores é conhecido, lê-os num pa:

soma.kriol
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}");
}

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:

Terminal window
kriol soma.kriol -o soma
printf '10\n20\n30\n' > dados.txt
./soma < dados.txt
Valor 1: Valor 2: Valor 3: Total: 60

As 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.

  • 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.