FUNCIONES BÁSICAS DE ENTRADA
Y SALIDA DEL LENGUAJE C
Se refiere a las operaciones que se producen en el teclado y en la
pantalla de la computadora. En C no hay palabras claves para realizar las
acciones de Entrada/Salida, estas se hacen mediante el uso de las funciones de
la biblioteca estándar (stadio.h).Para utilizar las funciones de E / S debemos
incluir en el programa el archivo de cabecera, ejemplo: stdio.h, mediante la
declaratoria:
#include <stdio.h>
Las Funciones de E/S más simples son getchar() que lee un carácter
del teclado, espera un retorno, es decir un enter y el eco aparece. Es
decir la tecla presionada.
putchar():Imprime un carácter en la pantalla, en la
posición actual del cursor. Algunas variaciones:
getche():Aparece el Eco
getch():No aparece el eco
estas instrucciones se encuentran
en la biblioteca conio.h
Programa que espera que se presiona una tecla, la muestra en
pantalla, y además muestra el carácter siguiente: Ejemplo 2.1:
#include <stdio.h>
#include <conio.h>
main()
{
char
car;
clrscr(); /*Se encarga de borrar la pantalla
por eso se llama clear screen*/
car=getchar();
putchar(car+1);
getch();
return 0;
}
Ejemplo 2.2:
#include <stdio.h>
#include
<conio.h>
main()
{
char
x; /*Declaramos x como carácter*/
printf("Para
Finalizar Presione cualquier Tecla:");
x=
getchar();/*Captura y muestra el carácter presionado*/
getch();/*Espera
a que se presione cualquier otra tecla para finalizar*/
return
0;
}
FUNCIONES DE ENTRADA Y
SALIDA (printf y scanf)
Salida de datos con formato: la función printf()
La función printf() (de “print” = imprimir y “f” = formato) sirve
para escribir datos en el dispositivo de salida estándar (generalmente la
pantalla) con un formato determinado por el programador. La forma general
de utilizarla es la siguiente:
printf(cadena_de_formato, datos);
El prototipo de printf() se encuentra en el archivo de cabecera stdio.h (de
“std” =standard e “io” = input/output, es decir, entrada/salida; por lo tanto,
“stdio” es unacrónimo de “entrada/salida estándar”)
El primer argumento, la cadena_de_formato,
especifica el modo en el que se deben mostrar los datos que aparecen a
continuación. Esta cadena se compone de una serie de códigos de formato que
indican a C qué tipo de datos son los que se desean imprimir. Todos los códigos
están precedidos del símbolo de porcentaje (“%”). Por ejemplo, el código “%i”
indica a la función que se desea escribir un número de tipo int ,y el
código “%f”, que se desea escribir un número real de tipo float
.La forma más simple de utilizar printf() es:
int a;
a = 5;
printf("%i",
a);
Esto escribirá el valor de la variable entera a en la pantalla, es decir,
5. Fíjese en que el primer argumento de printf() es una cadena (y, por lo
tanto, se escribe entre comillas)cuyo contenido es el código del tipo de dato
que se pretende escribir. El segundo argumento es el dato mismo.
En una sola instrucción printf() pueden escribirse varios datos. Por
ejemplo:
int a;
float x;
a = 5;
x = 10.33;
printf("%i%f",
a, x);
Observe detenidamente la cadena de formato: primero aparece “%i” y luego
“%f”.Esto indica que el primer dato que debe imprimirse es un entero, y el
segundo, un real. Después, aparecen esos datos separados por comas y
exactamente en el mismo orden que en la cadena de formato: primero a (la
variable entera) y luego x (la variable real).El resultado será que en la
pantalla se escribirán los números 5 y 10.33.
Hay códigos que admiten modificadores. Por ejemplo:
• Los códigos numéricos “%i”, “%d”, “%u” (para números enteros)
y “%f”, “%e” y“%g” (para números reales), permiten insertar
modificadores de longitud “l” (longitud doble) y “h” (longitud corta). Así, por
ejemplo, “%ld” indica que se va a imprimir un entero de longitud doble (long
int); “%hu” sirve para enteros cortos sin signo (unsignedshort int); “%lf”
indica que se imprimirá un número real de longitud doble (double),etc
.• El código “%f” (números reales) se pueden usar con un modificador deposiciones
decimales que se desean mostrar. Por ejemplo, con “%10.4f” obligamos a que se
impriman diez dígitos a la izquierda de la coma decimal y cuatro a la derecha.
La escritura se ajusta a la derecha. Para ajustarla a la izquierda se utiliza
el modificador “-”, de esta forma: “%-10.4f”
• El código “%s” (cadenas de caracteres) se puede combinar con un especificadorde
longitud máxima y mínima de la cadena. Por ejemplo, “%4.8s” escribe una cadena de
al menos cuatro caracteres y no más de ocho. Si la cadena tiene más, se pierden
rosque excedan de ocho. También se puede utilizar el modificador “-” para
alinear el texto a la izquierda.
Además de los códigos de formato,
en la cadena de formato puede aparecer cualquier texto entremezclado con los
códigos. A la hora de escribir en la pantalla, los códigos serán sustituidos
por los datos correspondientes, pero el resto del texto aparecerá de forma
literal. Por ejemplo:
int
a;
float
x;
a
= 5;
x
= 10.33;
printf("El
número entero es %i y el real es %f", a, x);
Lo que aparecerá en la pantalla al ejecutar este fragmento de código
será:
El número entero es 5 y el real es 10.33
Una última observación sobre printf(). Hay ciertos caracteres que no son directamente
imprimibles desde el teclado. Uno de ellos es el salto de línea. Para poder
ordenar a printf() que escriba un salto
de línea (o cualquier otro carácter no imprimible) se utilizan los códigos de
barra invertida, que con códigos especiales precedidos del carácter “\”.En
concreto, el carácter “salto de línea” se indica con el código “\n”. Observe las
diferencias entre estos dos bloques de instrucciones para intentar comprender la
importancia del salto de línea:
int a;
a = 5;
printf("La variable a vale %i", a);
a = 14;
printf("La variable a vale %i", a);
El resultado en la pantalla de la ejecución de estas instrucciones es:
La variable a vale 5 La
variable a vale 14
Veamos el mismo ejemplo usando el código del salto de línea (\n):
int a;
a = 5;
printf("La variable a vale %i\n", a);
a = 14;
printf("La variable a vale %i", a);
El resultado en la pantalla será:
La variable a vale 5
La variable a vale 14
ENTRADA DE DATOS CON
FORMATO: LA FUNCIÓN SCANF()
La función scanf() es, en muchos sentidos, la inversa de printf() .
Puede leer desde el dispositivo de entrada estándar (normalmente el teclado)
datos de cualquier tipo de los manejados por el compilador, convirtiéndolos al
formato interno apropiado. Funciona de manera análoga a printf(), por lo
que su sintaxis es:
scanf(cadena_de_formato, datos);
El prototipo de scanf() se encuentra en el archivo de cabecera stdio.h
(de “std” =standard e “io” = input/output, es decir, entrada/salida)
La cadena_de_formato tiene la misma composición que la de printf(). Los
datos son las variables donde se desea almacenar el dato o datos leídos desde
el teclado. ¡Cuidado! Con los tipos simples, es necesario utilizar el operador
& delante del nombre de la variable, porque esa variable se pasa por
referencia a scanf() para que ésta pueda modificarla.
Por ejemplo:
int a,
b;
float
x;
scanf("%d",
&a);
scanf("%d%f",
&b, &x);
La primera llamada a scanf() sirve para leer un número entero desde
teclado y almacenarlo en la variable a. La segunda llamada lee dos números: el
primero, entero, que se almacena en b; y, el segundo, real, que se almacena en x.
La función scanf() tiene alguna otra funcionalidad añadida para el manejo
de cadenas de caracteres que por ahora no vamos a discutir, para no agobiar.
EJEMPLO DE USO DE
SCANF() Y PRINTF()
Debido a la relativa complejidad de estas funciones de entrada y salida,
vamos a presentar un pequeño ejemplo de traducción de pseudocódigo a C. Se
trata de un algoritmo que lee dos números enteros, A y B. Si A es mayor que B
los resta, y en otro caso los suma.
En
pseudocódigo:
algoritmo suma_y_resta
variables a y b son enteros
inicio
escribir
("Introduzca dos números enteros")
leer(a, b)
si (a < b) entonces
escribir("La
suma de a y b es:", a+b)
si_no
escribir("La
resta de a menos b es:", a–b)
fin
En
lenguaje C:
/* Programa suma y resta */
#include
<stdio.h>
int
main()
{
int a, b;
printf ("Introduzca dos
números enteros\n");
scanf("%d%d",
&a, &b);
if (a
< b)
printf("La suma de %d y %d es: %d",
a, b, a+b);
else
printf("La resta de %d menos %d es:
%d", a, b, a–b);
return 0;
}
FUNCIONES DE ENTRADA
Y SALIDA (PUTS Y GETS)
FUNCIÓN GETS
Lee una cadena de carácter introducido por el teclado. Se puede
introducir caracteres hasta que se de un retorno de carro, (enter); el cual no
es parte de la cadena; en su lugar se coloca un terminador nulo \0.
Sintaxis:
char *gets(char *s);
Lee una cadena desde stdin.
Gets lee una cadena de caracteres terminada con un retorno de línea desde
la entrada estándar y la almacena en s. El carácter de retorno de línea es
reemplazado con el carácter nulo en s.
Observa que la manera en que
hacemos referencia a una cadena dentro de la funciones char *, el operador *
indica que debemos pasar como argumento la dirección de memoria donde estará
almacenada la cadena a leer. Veremos la explicación en el capítulo de punteros,
baste decir que a nivel del compilador char *cad y char cad[], son
equivalentes, o casi.
Gets permite la entrada de caracteres que indican huecos, como los
espacios y los tabuladores. gets deja de leer después de haber leído un
carácter de retorno de línea; todo aquello leído será copiado en s, incluido en
carácter de retorno de línea. Esta función no comprueba la longitud de la
cadena leída. Si la cadena de entrada no es lo suficientemente larga, los datos
pueden ser sobrescritos o corrompidos. Más adelante veremos que la
función fgets proporciona mayor control sobre las cadenas de entrada.
Valor de retorno:
Si tiene éxito, gets devuelve la
cadena s, si se encuentra el fin_de_fichero o se produce un error, devuelve tNULL.
Ejemplo:
char cad[80];
do {
gets(cad);
} while (cad[0] != '\000');
En este ejemplo, el programa permanecerá leyendo cadenas desde el teclado
mientras no introduzcamos una cadena vacía. Para comprobar que una cadena está
vacía basta con verificar que el primer carácter de la cadena es un carácter
nulo.
FUNCIÓN PUTS
Imprime en pantalla, el argumento guardado en la variable que se manda a
impresión.
Sintaxis:
int puts(const char *s);
Envía una cadena a stdout.
puts envía la cadena s terminada con nulo a la salida estándar stdout y
le añade el carácter de retorno de línea.
Valor de retorno: Si tiene éxito, puts devuelve un valor mayor o igual a
cero. En caso contrario devolverá el valor EOF.
Ejemplo:
char
cad[80];
int i;
do {
gets(cad);
for(i =
0; cad[i]; i++)
if(cad[i]
== ' ') cad[i] = '_';
puts(cad);}
while (cad[0] != '\000');
Empezamos a llegar a ejemplos más elaborados. Este ejemplo leerá cadenas
en "cad", mientras no introduzcamos una cadena vacía. Cada cadena
será recorrida carácter a carácter y los espacios de sustituirán por caracteres
'_'. Finalmente se visualizará la cadena resultante.
Llamo tu atención ahora sobre la condición en el bucle for, comparándola
con la del bucle do while. Efectivamente son equivalentes, al menos para i ==
0, la condición del bucle do while podría haberse escrito simplemente como
while (cad[0]). De hecho, a partir de ahora intentaremos usar expresiones más
simples.
POR ARCHIVOS
En C un archivo puede ser cualquier cosa, desde
un archivo de disco a un terminal o una impresora. Se asocia una secuencia con
un archivo específico realizando una operación de apertura, una vez que está
abierto, la información puede ser intercambiada entre éste y el programa. El
puntero a un archivo es el hilo que unifica el sistema de E/S con buffer. Un
puntero a un archivo es un puntero a una información que define varias cosas
sobre él, incluyendo el nombre, el estado y la posición actual del archivo. En
esencia, el puntero a un archivo identifica un archivo en disco específico y
utiliza la secuencia asociada para dirigir el funcionamiento de las funciones
de E/S con buffer. Para obtener una variable de tipo puntero a archivo se debe
utilizar una sentencia como la siguiente: FILE *punt;
La función fopen() abre una secuencia para que
pueda ser utilizada y le asocia a un archivo. Su prototipo es: FILE
*fopen(const char *nombre_archivo, const char *modo); Donde nombre_archivo es
un puntero a una cadena de caracteres que representan un nombre válido del
archivo y puede incluir una especificación de directorio. La cadena que apunta
modo determina cómo se abre el archivo. Los modos son los siguientes:
r: Abre un archivo de texto para lectura.
w: Crea un archivo de texto par escritura
a: Abre un archivo de texto para añadir
r+: Abre un archivo de texto para
lectura/escritura
w+: Crea un archivo de texto para
lectura/escritura
a+: Añade o crea un archivo de texto para
lectura/escritura
La función fclose() cierra una secuencia que
fue abierta mediante una llamada a fopen(). Escribe toda la información que
todavía se encuentre en el buffer del disco y realiza un cierre formal del
archivo a nivel del sistema operativo. También libera el bloque de control de
archivo asociado con la secuencia, dejándolo libre para su reutilización. A
veces es necesario cerrar algún archivo para poder abrir otro, debido a la
existencia de un límite del sistema operativo en cuanto al número de archivos
abiertos. Su prototipo es: int fclose(FILE *fp);
La función putc() escribe caracteres en un
archivo que haya sido abierto previamente para operaciones de escritura,
utilizando la función fopen(). Su prototipo es: int putc(int car, FILE *pf);
La función getc() escribe caracteres en un
archivo que haya sido abierto, en modo lectura, mediante fopen(). Su prototipo
es: int getc(FILE *pf);La función fputs() escribe la cadena en la secuencia
especificada. Su prototipo es: fputs() escribe la cadena en la secuencia
especificada. Su prototipo es: int fputs(const char *cad, FILE *pf);La función
fgets() lee una cadena de la secuencia especificada hasta que se lee un
carácter de salto de línea o hasta que se han leído longitud-1 caracteres.
La función rewind() inicia el indicador de
posición al principio del archivo indicado por su argumento. Su prototipo es:
rewind() inicia el indicador de posición al principio del archivo indicado por
su argumento. Su prototipo es: void rewind(FILE *pf);
Existen otras muchas funciones en la
biblioteca estándar de C (ver capítulo 13) como pueden serremove(): Borra el
archivo especificado.
fflush(): Vacía el contenido de una secuencia
de salida.
fread(): Lee tipos de datos que ocupan más de
un byte. Permiten la lectura de bloques de cualquier tipo de datos.
fwrite(): Escribe tipos de datos que ocupan más
de un byte. Permiten la escritura de bloques de cualquier tipo de datos.
fprintf(): Hace las funciones de printf()
sobre un fichero.
fscanf(): Hace las funciones de scanf() sobre
un fichero.
feof(): Detecta el final de un fichero.
ferror(): Detecta un error en la
lectura/escritura de un fichero.
fclose() cierra una secuencia que fue abierta
mediante una llamada a fopen().
putc() escribe caracteres en un archivo que
haya sido abierto previamente para operaciones de escritura, utilizando la
función fopen().
La función getc() escribe caracteres en un
archivo que haya sido abierto, en modo lectura, mediante fopen(). Su prototipo
es:
La función fputs() escribe la cadena en la
secuencia especificada. Su prototipo es: int fputs(const char *cad, FILE *pf);
La función fgets() lee una cadena de la
secuencia especificada hasta que se lee un carácter de salto de línea o hasta
que se han leído longitud-1 caracteres. Su prototipo es: fgets() lee una cadena
de la secuencia especificada hasta que se lee un carácter de salto de línea o
hasta que se han leído longitud-1 caracteres. Su prototipo es:int fgets(char
*cad, FILE *pf);
No hay comentarios:
Publicar un comentario