Tema 02 E-S Ficheros - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS... · 2 3...
-
Upload
truongphuc -
Category
Documents
-
view
221 -
download
0
Transcript of Tema 02 E-S Ficheros - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS... · 2 3...
1
1
Fundamentos de InformáticaETSII
Departamento de Sistemas Informáticos y ComputaciónUniversidad Politécnica de Valencia
Tema 2: Entrada y Salida de Datos. Ficheros.
2
Índice
1. Introducción: E/S2. Entrada de datos3. Salida de datos4. Formato de E/S: modificadores de los
códigos de control5. Ficheros
2
3
Objetivos
Consolidar los conocimientos de los operadores básicos de CConstruir un programa en C capaz de leer datos del usuario, realizar un cálculo sencillo y extraer un resultadoManejar un entorno de desarrollo
4
1. Introducción: E/SFunciones 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>
3
5
Entrada Salida
Entrada: el usuario introduce datos al
programa (escribe por teclado)
Salida: el programa muestra datos por
pantalla.
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).
Lectura Escritura
6
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.
4
7
Salida de un único carácter (escritura)putchar(): escribe un carácter por pantalla.
Ejemplo:char c = ‘j’;putchar(c);
Ejemplo:void main(){char ch;ch = getchar();putchar(ch);putchar(getchar());}
8
Caracteres de control
Hexadecimal%x
Octal%oCadena de caracteres%sReal en notación científica%eReal en coma flotante%fCarácter%cEntero Largo%ldEntero sin signo%uEntero%d
DatoCarácter de control
5
9
Caracteres de controlImprimir 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.
10
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?
Ejemplo
6
11
Ejemploint 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
12
Ejemploint codigo=89, n1=4, n2=66, n3=7, n4=8, n5=53, desc=10;float precio=400;char control=‘H’;
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);
Código del artículo 89
Letra de control del artículo H
Precio del artículo 400 (descuento:10%)
Cinco números enteros 4 66 7 8 53
7
13
Ejemplo
Mi nombre es Carmenprintf (“Mi nombre es %s\n”, “Carmen”);
El carácter A tiene el ASCII 65
char c=65;printf (“El carácter %c tiene el ASCII %d\n”, c, c);
SalidaInstrucción
14
Ejemplo
Número en decimal y hexadecimal: 10-Aprintf(“%s: %d-%x”, “Número en decimal y hexadecimal”, 10, 10);
línea 1línea 2
int i=1;printf(“línea %d\nlínea %d”, i, i++);
10 es entero, 10.00000 es realprintf(“%d es entero, %f es real”, 10, 10);
El descuento es del 25%printf(“El descuento es del %d%%”, 25);
Esto es una cadena y esto un entero 100printf(“%s y esto un entero %d”, “Esto es una cadena”, 100);
SalidaInstrucción
8
15
Utilización de printf para conversiones
ComentariosSalidaInstrucción
En el segundo caso, los números entre 32767 y 65536 serían negativos, como sobrepasa el número pasa a ser 80 positivo.
65616 80printf(“%ld %d\n”, 65616, 65616);
El ASCII de P es 80 (256 + 80 = 336)336 Pprintf(“%d %c\n”,336,336);
A 65printf(“%c %d\n”,‘A’,‘A’);
Los números se representan en C2, por lo que los valores positivos se representan como tales y los negativos complementados.
65200printf(“%u\n”, -336);
-336printf(“%d\n”, -336);
1 × 256 + 5 × 16 + 0 × 1 = 336150printf(“%x\n”, 336);
5 × 64 + 2 × 8 + 0 × 1 = 336520printf(“%o\n”, 336);
336printf(“%d\n”, 336);
16
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).
9
17
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();
18
Ejemplo
void main(){int edad;float sueldo;char mascota[30];
printf(“¿Edad, sueldo y mascota favorita ?\n”);scanf(“%d%f%s”, &edad, &sueldo, mascota);}
10
19
Ejemplo
void main(){int a, b;
printf(“Introduzca dos valores enteros:\n”);scanf(“%d%d”, &a, &b);printf(“%d + %d = %d\n”, a, b, a+b);}
Antes de un scanf hay que escribir un printf, para que el usuario sepa lo que debe
introducir.
20
Ejemplo
void main(){int a, b;printf(“Introduzca dos valores enteros\n”);scanf(“%d %d”, &a, &b);
Error: tiene blancosscanf(“Introduce a y b: %d%d”, &a, &b);
Error: tiene caracteres y blancosprintf(“%d + %d = %d\n”, a, b, 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.
11
21
Ejemplo
void main(){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 &}
Las variables de scanf van precedidas por & (excepto las cadenas de caracteres).
Las variables de printf no van precedidas de &.
22
Ejemplo#define n 100void main()
{int a, b;printf(“Introduzca dos valores enteros\n”);scanf(“%d%d”, &n, &7);
Error: se intentan leer constantesprintf(“%d + %d = %d\n”, a, 7, a+7);}
En scanf sólo puede aparecer variables.
En printf pueden aparecer variables, constantes o expresiones.
12
23
EjercicioRealizar un programa que calcule el perímetro de una circunferencia solicitando los datos al usuario.
#define PI 3.14159void main(){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);}
24
EjercicioRealizar un programa que calcule el área de un círculo (πr2).#define PI 3.14159
void main()
{
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);
}
13
25
EjercicioRealizar un programa que calcule la mitad, el cuadrado y el cubo de un número.void main()
{
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);
}
26
Otra versión:
#include <math.h>
void main()
{
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));
}
14
27
EjercicioRealizar un programa que pida la cantidad de artículos disponibles y su precio, y calcule el valor de las existencias.
void main()
{
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);
}
28
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).
15
29
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.
Modificadores de los códigos de control
30
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.
Modificadores de los códigos de control
16
31
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á.
Modificadores de los códigos de control
32
Ajuste% - comando_de_formato
Por defecto, todas las salidas se ajustan a la derecha. Signo menos (-): ajuste a la izquierda.
Modificadores de los códigos de control
17
33
Números largos (solo numéricos)% l comando_de_formato
Tipo numérico long.
Modificadores de los códigos de control
34
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);
Modificadores de los códigos de control
18
35
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);
Modificadores de los códigos de control
36
Ejemplo
336 printf (“%-10d”, 336);336printf (“%10d”, 336);
336printf (“%2d”, 336);336printf (“%d”, 336);3.45 printf (“%-5.2f”,3.452);hola printf (“%-10s”,”hola”);holprintf (“%2.3”,”hola”);
holaprintf (“%5.7”,”hola”);3.46printf (“%5.2f”,3.456);3.40printf (“%5.2f”,3.4);
000034printf (“%06d”,34);34printf (“%6d”,34);
SalidaPrintf
El carácter representa un espacio
en blanco
19
37
Ejemplo
1.235e+003printf (“%10.3e”, 1234.56);1234.560printf (“%10.3f”, 1234.56);
1234.6printf (“%3.1f”, 1234.56);1234.56printf (“%4.2f”, 1234.56);1.234560e+003printf (“%e”, 1234.56);1234.560000printf (“%f”, 1234.56);
SalidaPrintf
El carácter representa un espacio
en blanco
38
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 datosHola.txt
456
789
6.55datos.txt
20
39
Entrada: lectura de teclado o de fichero
Salida: muestra datos por pantalla o los
escribe en un fichero.
Lectura Escritura
Fichero modo lectura
Fichero modo
escritura
40
Nombre de fichero
Se identifica por un nombre y una extensión:NombreExtensión: define el tipo de archivo. Suele tener 3 caracteres.
Pepito.txt Fichero de textoH1.c Fichero de texto escrito en CPrueba.exe Fichero ejecutable
21
41
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
EOFListado.txt
42
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.
22
43
Operaciones con ficheros: declaración de ficheros
Tipo del fichero: FILE *
FILE *f1, *f2;FILE *mi_fichero;FILE *a, *b, *c;
44
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.
23
45
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.
46
Operaciones con ficheros: abrir ficheros
Crea el fichero
OKEscritura al final (añadir)
a
Crea el fichero
Borra el contenido
Escrituraw
ErrorOKLecturar
Si el fichero no existe…
Si el fichero existe…
OperaciónModo
24
47
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 \\
48
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”);
25
49
Operaciones con ficheros: cerrar ficheros
fclose (puntero_fichero);
Ejemplo:FILE *f;f = fopen(“fichero.txt”, “r”);fclose(f);
50
EjercicioRealizar 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);}
26
51
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.
52
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 = 9datos.txt
27
53
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).
54
Ejercicio
void main(){int a, b;printf(“Introduzca dos valores enteros:\n”);scanf(“%d%d”, &a, &b);printf(“%d + %d = %d\n”, a, b, a+b);}
Modificar este programa para que lea los datos de un fichero (entrada.txt) y escriba a otro fichero (salida.txt).
28
55
void main(){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);}
Paso 1. Declarar las variables de tipo fichero.Paso 2. Abrir los ficheros
56
void main(){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);}
Paso 3. Cambiar las operaciones de lectura y escritura por las propias de ficheros.Paso 4. Añadir los punteros a fichero.
29
57
void main(){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);}
Paso 5. Cerrar los ficheros.Paso 6. Eliminar el printf destinado al usuario.
58
void main(){int a, b;FILE *fe, *fs;fe = fopen(“entrada.txt”, “r”);fs = fopen(“salida.txt”, “w”);
fscanf(fe, “%d%d”, &a, &b);fprintf(fs, “%d + %d = %d\n”, a, b, a+b);
fclose(fe);fclose(fs);}
Resultado final:
4 5
Entrada.txt
4 + 5 = 9
Salida.txt
30
59
EjercicioRealizar 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.14159void main(){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);}
60
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”.