Fundamentos de Informática ETSII Tema 2: Entrada y Salida de Datos. Ficheros. Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia 1 Índice 1. Introducción: E/S 2. Entrada de datos 3. Salida de datos 4. Formato de E/S: modificadores de los códigos de control 5. Ficheros 2 1
Objetivos Consolidar los conocimientos de los operadores básicos de C Construir un programa en C capaz de leer datos del usuario, realizar un cálculo sencillo y extraer un resultado Manejar un entorno de desarrollo 3 1. Introducción: E/S Funciones de E/S: transportan datos hacia o desde el programa. Entrada Introduce información en el computador. Salida Extrae información desde el computador No forman parte de la definición de C, son funciones de librería. El estándar ANSI define una biblioteca de E/S que permite tener una E/S común a todos los sistemas, para hacer los programas portables: stdio.h. Por eso se añade a todos los programas: #include <stdio.h> 4 2
Entrada: el usuario introduce datos al programa (escribe por teclado) Salida: el programa muestra datos por pantalla. Entrada Lectura Salida Escritura Entrada: puede ser también desde fichero (lee los datos de un fichero). Salida: puede ser también a fichero (escribe datos en un fichero). 5 2. Salida de datos por pantalla (escritura) printf ( cadena de control, lista de variables); Cadena de control: indica como se van a visualizar los datos. Formada por literales y caracteres de control. Los caracteres de control indican como deben visualizarse los datos en pantalla. Variables: se separan por comas. Puede incluir constantes. Para cada variable o constante a mostrar debe existir un carácter de control. 6 3
Salida de un único carácter (escritura) putchar(): escribe un carácter por pantalla. Ejemplo: char c = j ; putchar(c); Ejemplo: char ch; ch = getchar(); putchar(ch); putchar(getchar()); 7 Caracteres de control Carácter de control %d %u %ld %c %f %e %s %o %x Dato Entero Entero sin signo Entero Largo Carácter Real en coma flotante Real en notación científica Cadena de caracteres Octal Hexadecimal 8 4
Caracteres de control Imprimir el carácter % dentro de la cadena de control: %%. Los caracteres que se visualizan con %c deben ir entre comillas simples, para %s deben ir entre comillas dobles. Igual número de argumentos que de comandos de formato. Un tipo de datos puede convertirse a otro tipo de datos en pantalla utilizando los caracteres de control adecuados. Para saltar de línea se incluye \n en la cadena de control. Para incluir un tabulador se pone \t. 9 Ejemplo int a=4, b=5, c; c= a + b; printf( La suma es %d\n, c); printf( %d + %d = %d\n, a, b, c); printf( Hola ); printf(, Qué tal?\n ); La suma es 9 4 + 5 = 9 Hola, Qué tal? 10 5
Ejemplo int ganancia=20; printf( La ganancia es del %d%%.\n,ganancia); La ganancia es del 20%. printf( Esto es un carácter: %c.\n, a ); printf( Esto es una cadena: %s.\n, Hola mundo ); Esto es un carácter: a. Esto es una cadena: Hola mundo. printf( Entero: %d Real: %f\n, 9.3, 9.3); Entero: 9 Real: 9.3 11 Ejemplo int codigo=89, n1=4, n2=66, n3=7, n4=8, n5=53, desc=10; Código del artículo 89 float precio=400; Letra de control del artículo H char control= H ; Precio del artículo 400 (descuento:10%) Cinco números enteros 4 66 7 8 53 printf( Código del artículo %d\n, codigo); printf( Letra de control del artículo %c\n, control); printf( Precio del artículo %f (descuento:%d%%)\n, precio, desc); printf( Cinco números enteros %d %d %d %d %d\n, n1, n2, n3, n4, n5); 12 6
Ejemplo Instrucción char c=65; printf ( El carácter %c tiene el ASCII %d\n, c, c); printf ( Mi nombre es %s\n, Carmen ); Salida El carácter A tiene el ASCII 65 Mi nombre es Carmen 13 Ejemplo Instrucción printf( %s y esto un entero %d, Esto es una cadena, 100); printf( El descuento es del %d%%, 25); printf( %d es entero, %f es real, 10, 10); int i=1; printf( línea %d\nlínea %d, i, i++); printf( %s: %d-%x, Número en decimal y hexadecimal, 10, 10); El descuento es del 25% 10 es entero, 10.00000 es real línea 1 línea 2 Salida Esto es una cadena y esto un entero 100 Número en decimal y hexadecimal: 10-A 14 7
Utilización de printf para conversiones Instrucción printf( %d\n, 336); Salida 336 Comentarios printf( %o\n, 336); 520 5 64 + 2 8 + 0 1 = 336 printf( %x\n, 336); 150 1 256 + 5 16 + 0 1 = 336 printf( %d\n, -336); -336 printf( %u\n, -336); printf( %c %d\n, A, A ); 65200 A 65 Los números se representan en C2, por lo que los valores positivos se representan como tales y los negativos complementados. printf( %d %c\n,336,336); 336 P El ASCII de P es 80 (256 + 80 = 336) printf( %ld %d\n, 65616, 65616); 65616 80 En el segundo caso, los números entre 32767 y 65536 serían negativos, como sobrepasa el número pasa a ser 80 positivo. 15 3. Entrada de datos de teclado (lectura) scanf ( cadena de control, lista de variables); Para leer un valor perteneciente a cualquiera de los tipos básicos, se usa el nombre de la variable precedido por &. Para leer una variable de tipo cadena de caracteres, no se pone & (ya es un puntero). La cadena de control no debe tener espacios en blanco. Para separar los datos de entrada se usan blancos, tabulaciones o intro (excepto char, no es necesario). 16 8
Entrada de un único carácter (lectura) Toma un carácter de la entrada y lo retorna: getchar(): entrada estándar. getch(): teclado. getche(): teclado con eco en pantalla. Ejemplo: char c; c = getchar(); 17 Ejemplo int edad; float sueldo; char mascota[30]; printf( Edad, sueldo y mascota favorita?\n ); scanf( %d%f%s, &edad, &sueldo, mascota); 18 9
Ejemplo int a, b; Antes de un scanf hay que escribir un printf, para que el usuario sepa lo que debe introducir. printf( Introduzca dos valores enteros:\n ); scanf( %d%d, &a, &b); printf( %d + %d = %d\n, a, b, a+b); 19 Ejemplo int a, b; La cadena de control de scanf sólo puede contener comandos de control. La cadena de control de printf puede tener cualquier cosa. printf( Introduzca dos valores enteros\n ); scanf( %d %d, &a, &b); Error: tiene blancos scanf( Introduce a y b: %d%d, &a, &b); Error: tiene caracteres y blancos printf( %d + %d = %d\n, a, b, a+b); 20 10
Ejemplo Las variables de scanf van precedidas por & (excepto las cadenas de caracteres). Las variables de printf no van precedidas de &. int a, b; printf( Introduzca dos valores enteros\n ); scanf( %d%d, a, b); Error: falta & printf( %d + %d = %d\n, &a, &b, &a+b); Error: sobra & 21 Ejemplo #define n 100 int a, b; printf( Introduzca dos valores enteros\n ); scanf( %d%d, &n, &7); En scanf sólo puede aparecer variables. En printf pueden aparecer variables, constantes o expresiones. Error: se intentan leer constantes printf( %d + %d = %d\n, a, 7, a+7); 22 11
Ejercicio Realizar un programa que calcule el perímetro de una circunferencia solicitando los datos al usuario. #define PI 3.14159 float radio, perimetro; printf( Por favor, introduzca el radio de la circunferencia: ); scanf( %f, &radio); perimetro = 2*PI*radio; printf( El perímetro de la circunferencia es %f, perimetro); 23 Ejercicio Realizar un programa que calcule el área de un círculo (πr 2 ). #define PI 3.14159 float radio, area; printf( Por favor, introduzca el radio de la circunferencia: ); scanf( %f, &radio); area = PI*radio*radio; printf( El área del círculo vale %f\n, area); 24 12
Ejercicio Realizar un programa que calcule la mitad, el cuadrado y el cubo de un número. float numero; printf( Por favor, introduzca el número: ); scanf( %f, &numero); printf( La mitad de %f es %f, numero, numero/2); printf( El cuadrado de %f es %f, numero, numero*numero); printf( El cubo de %f es %f, numero, numero*numero*numero); 25 Otra versión: #include <math.h> float numero; printf( Por favor, introduzca el número: ); scanf( %f, &numero); printf( La mitad de %f es %f, numero, numero/2); printf( El cuadrado de %f es %f, numero, pow(numero,2)); printf( El cubo de %f es %f, numero, pow(numero,3)); 26 13
Ejercicio Realizar un programa que pida la cantidad de artículos disponibles y su precio, y calcule el valor de las existencias. float precio; int cantidad; printf( Introduzca la cantidad de artículos: ); scanf( %d, &cantidad); printf( Introduzca el precio de los artículos: ); scanf( %f, &precio); printf( El valor de las existencias es de %f, cantidad*precio); 27 4. Formato de E/S Los modificadores de los códigos de control permiten dar formato a los datos en pantalla: Presentar datos en forma de tabla. Tamaño de los datos. Número de posiciones decimales. Se colocan en los comandos de control de printf entre el % y la letra posterior (por ejemplo %3d). 28 14
Modificadores de los códigos de control Anchura mínima de campo % [0] anchura comando_de_formato La salida se rellena con espacios en blanco a la izquierda hasta alcanzar la anchura. Para rellenar con ceros se coloca un cero delante de la anchura. Si la anchura del campo es mayor que la indicada, se mostrará completo. 29 Modificadores de los códigos de control Número de decimales (reales) % X.Y comando_de_formato X es el número total de posiciones (mínimo) que ocupa. Y es el número de posiciones decimales. El punto ocupa una posición. Si el número de decimales es mayor que el especificado se trunca. Si el número de posiciones es menor que el necesario, muestra la parte decimal con Y decimales y completa la parte entera. 30 15
Modificadores de los códigos de control Formateo de cadenas (sólo cadenas) % X.Y s X es el número mínimo de caracteres. Y es el número máximo de caracteres. Si la cadena es más larga de Y posiciones, la salida se truncará. 31 Modificadores de los códigos de control Ajuste % - comando_de_formato Por defecto, todas las salidas se ajustan a la derecha. Signo menos (-): ajuste a la izquierda. 32 16
Modificadores de los códigos de control Números largos (solo numéricos) % l comando_de_formato Tipo numérico long. 33 Modificadores de los códigos de control Modificador * para printf %_*[.*]_comando de formato Con * se ajusta la longitud del campo mediante un argumento que se indica previamente como un ítem más de la lista de argumentos. Para valores en coma flotante se indica la anchura total y el número de decimales (*.*). printf( Cual es el ancho?\n ); scanf( %d\n, &ancho); printf( El número es %*d\n, ancho, numero1); printf( Cifras decimales y ancho total?\n ); scanf( %d %d\n, &decimales, &ancho); printf( El número es %*.*f\n, ancho, decimales, numero2); 34 17
Modificadores de los códigos de control Modificador * para scanf %_*_comando de formato No se almacena ese valor en una variable. /* Lee sólo el tercer entero */ scanf( %*d%*d%d, &n); 35 Ejemplo El carácter representa un espacio en blanco Printf printf ( %6d,34); printf ( %06d,34); printf ( %5.2f,3.4); printf ( %5.2f,3.456); printf ( %5.7, hola ); printf ( %2.3, hola ); printf ( %-10s, hola ); printf ( %-5.2f,3.452); printf ( %d, 336); printf ( %2d, 336); printf ( %10d, 336); printf ( %-10d, 336); Salida 34 000034 3.40 3.46 hola hol hola 3.45 336 336 336 336 36 18
Ejemplo El carácter representa un espacio en blanco Printf printf ( %f, 1234.56); printf ( %e, 1234.56); printf ( %4.2f, 1234.56); printf ( %3.1f, 1234.56); printf ( %10.3f, 1234.56); printf ( %10.3e, 1234.56); Salida 1234.560000 1.234560e+003 1234.56 1234.6 1234.560 1.235e+003 37 5. Ficheros Archivo o fichero: conjunto de datos almacenado en un dispositivo de almacenamiento secundario: memoria fija (disco duro, DVD, CD). Independiente de la información que contengan (datos, programas, textos, gráficos,...). Hola Soy un fichero Contengo datos Hola.txt 456 789 6.55 datos.txt 38 19
Entrada: lectura de teclado o de fichero Salida: muestra datos por pantalla o los escribe en un fichero. Fichero modo lectura Lectura Escritura Fichero modo escritura 39 Nombre de fichero Se identifica por un nombre y una extensión: Nombre Extensión: define el tipo de archivo. Suele tener 3 caracteres. Pepito.txt Fichero de texto H1.c Fichero de texto escrito en C Prueba.exe Fichero ejecutable 40 20
Fin de fichero Todos los ficheros terminan en un carácter especial que indica el final del fichero: EOF (end of file). María Pérez Gómez 8.5 Andres López García 9.0 Ana Ruiperez Gómez 2.4 EOF Listado.txt 41 Operaciones con ficheros Definir una variable de tipo fichero (FILE *) : declaración del fichero. Abrir el fichero. Operar con el fichero: leer del fichero o escribir al fichero. Cerrar el fichero. 42 21
Operaciones con ficheros: declaración de ficheros Tipo del fichero: FILE * FILE *f1, *f2; FILE *mi_fichero; FILE *a, *b, *c; 43 Operaciones con ficheros: abrir ficheros variable_fichero = fopen (nombre_fichero, modo); Nombre del fichero: cadena de caracteres indicando el nombre completo del fichero y el path. Modo: indica el uso al que se va a destinar el fichero. 44 22
Operaciones con ficheros: abrir ficheros Modos: r Abre el fichero para lectura. El fichero debe existir, sino se produce un error. a Abre el fichero para añadir datos al final del fichero. Si el fichero no existe, lo crea. w Abre el fichero para escritura. Si el fichero existe borra su contenido. Si no existe, lo crea. 45 Operaciones con ficheros: abrir ficheros Modo Operación Si el fichero existe Si el fichero no existe r Lectura OK Error w Escritura Borra el contenido Crea el fichero a Escritura al final (añadir) OK Crea el fichero 46 23
Operaciones con ficheros: abrir ficheros Nombre del fichero: Entre comillas dobles: prueba.txt. Con extensión. Si no está en el directorio por defecto debe incluir el path: c:\\temp\\prueba.txt. Las barras \ del path se duplican \\ 47 Operaciones con ficheros: abrir ficheros FILE *fichero, *f1, *ejemplo, *f; fichero = fopen ( c:\\temp\\prueba.txt, r ); f1 = fopen ( hola.txt, a ); ejemplo = fopen ( a:\\ejemplo.txt, w ); #define nombre ejemplo.txt f = fopen (nombre, w ); 48 24
Operaciones con ficheros: cerrar ficheros fclose (puntero_fichero); Ejemplo: FILE *f; f = fopen( fichero.txt, r ); fclose(f); 49 Ejercicio Realizar un programa que abra el fichero pepito.txt para lectura y lo cierre. #include <stdio.h> void main () FILE *f; f = fopen( pepito.txt, r ); fclose(f); 50 25
Salida de datos a fichero (escritura) fprintf (fichero, cadena de control, lista de variables); Fichero: variable de tipo fichero de donde se van a escribir los datos. Cadena de control: indica como se van a visualizar los datos. Formada por literales y caracteres de control. Los caracteres de control indican como deben visualizarse los datos en pantalla. Variables: se separan por comas. Puede incluir constantes. Para cada variable o constante a mostrar debe existir un carácter de control. 51 Salida de datos a fichero (escritura) Sólo se puede escribir en un fichero si está abierto para escritura (modo w ) o para añadir datos (modo a ). FILE *f; int a=4, b=5, c; f=fopen( datos.txt, w ); c=a+b; fprintf(f, La suma es %d\n, c); fprintf(f, %d + %d = %d\n, a, b, c); fclose(f); La suma es 9 4 + 5 = 9 datos.txt 52 26
Entrada de datos de fichero (lectura) fscanf (fichero, cadena de control, lista de variables); Para leer un valor perteneciente a cualquiera de los tipos básicos, se usa el nombre de la variable precedido por &. Para leer una variable de tipo cadena de caracteres, no se pone & (ya es un puntero). La cadena de control no debe tener espacios en blanco. Para separar los datos de entrada se usan blancos, tabulaciones o intro (excepto char, no es necesario). 53 Ejercicio Modificar este programa para que lea los datos de un fichero (entrada.txt) y escriba a otro fichero (salida.txt). int a, b; printf( Introduzca dos valores enteros:\n ); scanf( %d%d, &a, &b); printf( %d + %d = %d\n, a, b, a+b); 54 27
Paso 1. Declarar las variables de tipo fichero. Paso 2. Abrir los ficheros int a, b; FILE *fe, *fs; fe = fopen( entrada.txt, r ); fs = fopen( salida.txt, w ); printf( Introduzca dos valores enteros:\n ); scanf( %d%d, &a, &b); printf( %d + %d = %d\n, a, b, a+b); 55 Paso 3. Cambiar las operaciones de lectura y escritura por las propias de ficheros. Paso 4. Añadir los punteros a fichero. int a, b; FILE *fe, *fs; fe = fopen( entrada.txt, r ); fs = fopen( salida.txt, w ); printf( Introduzca dos valores enteros:\n ); fscanf(fe, %d%d, &a, &b); fprintf(fs, %d + %d = %d\n, a, b, a+b); 56 28
Paso 5. Cerrar los ficheros. Paso 6. Eliminar el printf destinado al usuario. int a, b; FILE *fe, *fs; fe = fopen( entrada.txt, r ); fs = fopen( salida.txt, w ); printf( Introduzca dos valores enteros:\n ); fscanf(fe, %d%d, &a, &b); fprintf(fs, %d + %d = %d\n, a, b, a+b); fclose(fe); fclose(fs); 57 Resultado final: int a, b; FILE *fe, *fs; fe = fopen( entrada.txt, r ); fs = fopen( salida.txt, w ); 4 5 Entrada.txt fscanf(fe, %d%d, &a, &b); fprintf(fs, %d + %d = %d\n, a, b, a+b); fclose(fe); fclose(fs); 4 + 5 = 9 Salida.txt 58 29
Ejercicio Realizar un programa que calcule el perímetro de una circunferencia. El valor del radio se encuentra en el fichero radio.txt. Escribir el resultado por pantalla. #define PI 3.14159 float radio, perimetro; FILE *f; f=fopen( radio.txt, r ); fscanf(f, %f, &radio); perimetro = 2*PI*radio; printf( El perímetro de la circunferencia es %f, perimetro); fclose(f); 59 Ejercicio Realizar un programa que lea la cantidad de artículos disponibles y su precio del fichero dispon.txt. El programa debe calcular el valor de las existencias (cantidad * precio) y escribirlo en el fichero existen.txt. 60 30
float precio; int cantidad; FILE *lec, *escr; lec = fopen( dispon.txt, r ); escr = fopen( existen.txt, w ); fscanf (lec, %d%f, &cantidad, &precio); fprintf (escr, El valor de las existencias es de %f, cantidad*precio); fclose(lec); fclose(escr); 61 31