tema 02 e-s ficheros - users.dsic.upv.esusers.dsic.upv.es/~onaindia/teaching/fundamentos... · 2 3...

31
1 1 Fundamentos de Informática ETSII Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia Tema 2: Entrada y Salida de Datos. Ficheros. 2 Í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

Upload: truongphuc

Post on 01-Oct-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

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”.

31

61

void main(){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);}