martes, 21 de febrero de 2012

Funciones estándar de entrada y de salida


El lenguaje C sólo cuenta con operadores e instrucciones de control de flujo. Cualquier otra operación que se desee realizar hay que programarla o bien emplear las funciones de que se disponga en nuestra biblioteca de programas.

El lenguaje C cuenta con un amplio conjunto de funciones estándar entre las que se encuentran las de entrada y de salida de datos, que veremos en esta sección. El compilador de C tiene que saber (nombre y tipo de datos de los argumentos y del valor devuelto) qué funciones utilizará nuestro programa para poder generar el código ejecutable de forma correcta. Por tanto, es necesario incluir los ficheros de cabecera que contengan sus declaraciones en el código de nuestro programa. En este caso:
#include <stdio.h>
Funciones de salida estándar

La salida estándar es el lugar donde se muestran los datos producidos (mensajes, resultados, etcétera) por el programa que se encuentra en ejecución. Normalmente, esta salida es la pantalla del ordenador o una ventana dentro de la pantalla. En este último caso, se trata de la ventana asociada al programa.
printf( "formato" [, lista_de_campos ] )
Esta función imprime en la pantalla (la salida estándar) el texto contenido en “formato”. En este texto se sustituyen los caracteres especiales, que deben de ir precedidos por la barra invertida (\), por su significado en ASCII. Además, se sustituyen los especificadores de campo, que van precedidos por un %, por el valor resultante de la expresión (normalmente, el contenido de una variable) correspondiente indicada en la lista de campos. Este valor se imprime según el formato indicado en el mismo especificador.

La tabla siguiente muestra la correspondencia entre los símbolos de la cadena del formato de impresión y los caracteres ASCII.n se utiliza para indicar un dígito de un número:


Indicación de carácter
Carácter ASCII
\nnew line (salto de línea)
\fform feed (salto de página)
\bbackspace (retroceso)
\ttabulator (tabulador)
\nnnASCII número  nnn
\0nnnASCII número  nnn (en octal)
\0XnnASCII número  nn (en hexadecimal)
\\backslash (barra invertida)

Los especificadores de campo tienen el formato siguiente:
%[-][+][anchura[.precisión]]tipo_de_dato
Los corchetes indican que el elemento es opcional. El signo menos se emplea para indicar alineación derecha, cosa habitual en la impresión de números. Para éstos, además, si se especifica el signo más se conseguirá que se muestren precedidos por su signo, sea positivo

o negativo. La anchura se utilizará para indicar el número mínimo de caracteres que se utilizarán para mostrar el campo correspondiente y, en el caso particular de los números reales, se puede especificar el número de dígitos que se desea mostrar en la parte decimal mediante la precisión. El tipo de dato que se desea mostrar se debe incluir obligatoriamente y puede ser uno de los siguientes:

Enteros:


%dEn decimal
%iEn decimal
%uEn decimal sin signo
%oEn octal sin signo
$xEn hexadecimal

Reales:


%fEn punto flotante
%eCon formato expotencial: [+/-]0.000e[+/-]000 con e minúscula o mayúscula (%E)
%gEn formato e, f, o d

Otros:


%cCarácter
%sCadena de caracteres
%%El signo de %


Funciones de entrada estándar

Se ocupan de obtener datos de la entrada estándar que, habitualmente, se trata del teclado. Devuelven algún valor adicional que informa del resultado del proceso de lectura. El valor devuelto no tiene por qué emplearse si no se necesita, pues muchas veces se conoce que la entrada de datos se puede efectuar sin mayor problema.
scanf( "formato" [, lista_de_&variables ] )
Lee del buffer del teclado para trasladar su contenido a las variables que tiene como argumentos. La lectura se efectúa según el formato indicado, de forma similar a la especificación de campos empleada para printf.

Para poder depositar los datos leídos en las variables indicadas, esta función requiere que los argumentos de la lista de variables sean las direcciones de memoria en las que se encuentran. Por este motivo, es necesario emplear el operador “dirección de” (&). De esta manera, scanf deja directamente en las zonas de memoria correspondiente la información que haya leído y, naturalmente, la variable afectada verá modificado su contenido con el nuevo dato.

Es importante tener presente que si se especifican menos argumentos que especificadores de campo en el formato, los resultados pueden ser imprevisibles, pues la función cambiará el contenido de alguna zona de memoria totalmente aleatoria.
scanf( "%d", &num_articulos );
En el ejemplo anterior, scanf lee los caracteres que se tecleen para convertirlos (presumiblemente) a un entero. El valor que se obtenga se colocará en la dirección indicada en su argumento, es decir, en el de la variable num_articulos. Esta lectura de caracteres del buffer de memoria del teclado se detiene cuando el carácter leído no se corresponde con un posible carácter del formato especificado. Este carácter se devuelve al buffer para una posible lectura posterior. Para la entrada que se muestra en la figura siguiente, la función detiene la lectura después del espacio en blanco que separa los números tecleados. Éste y el resto de caracteres se quedan en el buffer para posteriores lecturas.

La función scanf devuelve el número de datos correctamente leídos. Es decir, todos aquellos para los que se ha encontrado algún texto compatible con una representación de su tipo.



Fuente: Libro Introducción al desarrollo del software

0 comentarios:

Publicar un comentario