4. Operações de Entrada e Saída

4.1 Introdução

Nos capitulos anteriores utilizaram-se algumas funções de entrada e saída de dados que, só agora serão explicadas com mais pormenor. Estas funções, não são intrínsecas à linguagem, tendo sendo desenvolvidas à parte e encontram-se em bibliotecas (conjunto de ficheiros fonte compilados e agrupados num ficheiro). As funções básicas de input e output disponíveis em todas as implementações de C constituem a biblioteca de rotinas standard (Standard library routines). Várias declarações e macros necessárias a estas rotinas são incluidas num programa através da linha

#include <stdio.h>

4.2 Saída Formatada

As rotinas de output formatado aqui apresentadas são :

printf (s_control,arg1,arg2,...);

Escreve a string de controle 's_control' no terminal. Os argumentos serão introduzidos na string de controle de acordo com as especificações nelas existentes.

sprintf (buf,s_control,arg1,arg2,...);

O mesmo que printf() excepto que o output é colocado num buffer (i.e. um array) especificado por buf.

4.2.1 Especificações da Saída Formatada

As especificações do formato para printf() começam com um caracter % e terminam com um caracter de conversão. Existem várias opções e caracteres de conversão possíveis. Os caracteres de conversão, e as resultantes interpretações dos correspondentes argumentos são os seguintes:

- c => Um caracter simples.
- d => Inteiro na notação decimal
- o => Inteiro na notação octal (não esquecer o zero do número, que deve ser incluido explicitamente)
- x => Inteiro na notação hexadecimal (não esquecer o '0x' do número
- u => Inteiro sem sinal em notação decimal
- s => Array de caracteres; os caracteres são imprimidos em sucessão até o caracter nulo '\0' ser alcançado
- f => float ou double, imprimido em notação decimal de acordo com a especificação adicional descrita abaixo.
- e => float ou double, imprimido em notação cientifica de acordo com a especificação adicional descrita abaixo.
- g => float ou double, imprimido como um %e ou %f.

Qualquer outro caracter é imprimido literalmente; por exemplo, printf (%%) imprime o sinal de percentagem. Os números são escritos justificados à direita.

As especificações podem opcionalmente incluir (na ordem seguinte):

- Um sinal menos que indica que o argumento deve ser justificado à esquerda no campo de output.
- Uma string de dígitos que especifica a largura mínima do campo para este argumento.Se o argumento convertido tiver menos caracteres é encostado à esquerda (ou à direita se o argumento é um ente justificado à esquerda).
- Um ponto que separa a largura do campo de precisão.
- Uma string que especifica o n.º máximo de caracteres a ser imprimidos da string, ou (se foi imprimido um n.º de virgula flutuante) o n.º de digitos a ser imprimido à direita do ponto decimal.Se isto é omitido para o n.º de virgula flutuante, a precisão por defeito é 6.
- O caracter l indica que o argumento é um long.

Exemplos : Saídas da impressão com printf da string Instituto Politécnico, simulando os espaços em branco com _ (Underscore).

%24s | ________Instituto Politécnico
%-24s | Instituto Politécnico________
%24 16s | ________Instituto Polité
%-24 16s | Instituto Polité________
%16s | Instituto Polité

4.3 Entrada Formatada

A rotina scanf() de input formatado torna o input numa forma que é rigorosamente o inverso do printf(). A sintaxe é:

scanf(s_control,arg1,arg2,...);

onde s_control é uma string. O input é lido e interpretado de acordo com a string de controle. Cada um dos restantes argumentos deverá ser um endereço, o input é armazenado nesse endereço tendo em atenção as especificações de conversão da string de controle.
Se se pretender ler um inteiro, a tendência será para escrever

int i;
scanf (%d,i);

tal, no entanto, não funciona, porque os argumentos da scanf devem ser endereços.

Assim, dever-se-á escrever,

scanf (%d,&i);

em que,& é o operador que permite obter o endereço da variável.

Deve-se ter em atenção que a situação é distinta quando se pretende ler uma string, pois o nome da string é um endereço, como se discutirá no capítulo sobre arrays.

Um dos erros mais comuns com scanf é esquecer isto; fazer sempre com que todos os argumentos da função scanf sejam endereços.

A função

sscanf (buf,s_control,arg1,arg2,...);

funciona mais ou menos como a scanf excepto que lê dados de uma string buf em vez de os ler do teclado.

A string de controle das funções scanf, ou sscanf pode conter espaços brancos (os quais são ignorados), especificações de conversão e caracteres vulgares.

4.3.1 Especificações da entrada formatada

Especificações de conversão consistem no caracter %, no caracter opcional de supressão de atribuição *, num n.º opcional especificando a largura máxima do campo, e no caracter de conversão.

Os caracteres vulgares são esperados para combinar com o próximo caracter não branco do input. Se a supressão de atribuição é indicada com *, então o próximo campo de input é saltado. Os caracteres de conversão possíveis e as correspondentes interpretações de input são :

d => Inteiro decimal
o => Inteiro octal
x => Inteiro hexadecimal
c => Caracter simples: neste caso o salto normal de espaçoes brancos é suprimido no array de caracteres.
s => neste caso o argumento deve ser o endereco de um array de caracteres suficientemente grande para armazenar o input (incluindo o caracter nulo). Os caracteres são lidos até ser encontrado um espaço.
f => N.º de virgula flutuante, possivelmente incluindo o sinal e expoente.
e => o mesmo que 'f'.

Se os caracteres de conversão d,o ou x, são precedidos por um l, o input correspondente é interpretado como um número de vírgula flutuante de precisão dupla, double.

O argumento correspondente deve ser um endereço de um double em vez de um float. Esquecer isto é outro erro comum quando se utiliza a função scanf.

A função scanf pára quando atinge o fim da string de controle ou quando o input falha ao tentar cumprir com a especificação de controle. Retorna como valor, o n.º de campos de entrada que cumpriram e aos quais tenham sido atribuídos valores.

4.4 Outras funções da Biblioteca Standard.

Para além das funções de entrada e saída formatada já estudadas, existem outras funções também muito importantes. Estas funções tambem requerem a instrução de inclusão do ficheiro stdio.h.

Ler um caracter do standard input (teclado) :

int c;
c=getchar();

Esta funcao retorna um inteiro correspondente ao caracter entrado, ou o valor da constante EOF se atingiu o fim do ficheiro ou ocorreu um erro.

Escrever um caracter no standard output:

char string[80]
puts(string);

Ler uma string do standard input terminada com \n:

gets(string);

A string lida é colocada em string. A função retorna o valor da constante NULL quando encontra o fim do ficheiro ou em caso de erro.

4.5 Outras funções

Todas as funções apresentadas têm em comum, o fazer parte da livraria (biblioteca) standard, no entanto os compiladores oferecem outras funções. Estas dependem normalmente do sistema, e como tal, exploram bastante bem as suas potencialidades.

São apresentadas as duas funções seguintes que existem na generalidade dos compiladores:

c=getche();

em que c é um inteiro. Esta função permite ler um caracter do teclado,sem necessidade de em seguida se digitar a tecla [ENTER]. O caracter lido é mostrado (ecoado) no ecrâ.

c=getch();

Idêntica à anterior apenas com a diferença de não mostrar o caracter lido no ecrã (stdout). O facto de estas funções não necessitarem que a tecla [ENTER] seja premida, faz com que seja de grande interesse a sua utilização.

Normalmente, é necessário a inclusão da instrução:

#include <conio.h>

para a sua utilização.

Back | Up | Forward

To front page | Pages by Nuno Nunes. |