Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C Sesión 3

Documentos relacionados
Tema 3: Entrada/Salida de Ficheros

Fundamentos de Informática 7. Introducción al manejo de archivos

Programación 1 Grado de Ingeniería Robótica

LENGUAJE. Tema 8 Ficheros

Para C un chero no es más que una porción de almacenamiento

Operaciones de E/S en ANSI C

Tema 6. Gestión de ficheros en C. Programación en Lenguajes Estructurados

Archivos. Programación en C 1

SEMINARIO C para programadores java (este seminario forma parte de las actividades del proyecto piloto) Sesión 3

Algoritmos y estructuras de datos

Tema 13: Manejo de archivos en lenguaje C

Bloque 9. Ficheros de texto

Lenguajes de programación LPSI EUI UPM CADENAS DE CARACTERES

Tema 5. Entrada y Salida

Analista Universitario en Sistemas. Taller de Programación II. Instituto Politécnico Superior ARCHIVOS. (File Management)

6. Archivos. Programación II, FCFM, BUAP

U.A.B.C. Facultad de Ingeniería Programación Estructurada UNIDAD VI. UNIDAD VI Archivos.

Informática Ingeniería en Electrónica y Automática Industrial

Concepto Concept s Los L nom res re d e e los h c eros: exter te n r os o o fí s fí ico nom re ú nico i del del ar chiv chiv o o o ficher ficher en

Entrada/Salida. Entrada/Salida. Flujos de texto. Flujos de datos. Flujos binarios. Flujos estándares ANSI

SEMINARIO C para programadores java (este seminario forma parte de las actividades del proyecto piloto) Sesión 4

Caracter a caracter los datos pueden ser escritos o leidos carácter a carácter, con las funciones fputc() y fgetc().

EJERCICIOS. Algo de C CADENAS

Programación I Teoría : Entrada/Salida - Archivos.

Ejercicios de la sesión 4 de C resueltos

FILE *nombre_puntero_fichero; fopen(char_nombre_archivo,char_modo_apertura ); MODOS DE APERTURA. Abre un archivo de texto para lectura.

Índice. Estructuras de datos en Memoria Principal: Vectores. Matrices. Cadenas de caracteres. Estructuras. Estructuras de datos en Memoria Externa:

OPERACIONES SOBRE LENGUAJES REGULARES LA UNIÓN DE LENGUAJES REGULARES

Ficheros. Archivo, o fichero: Características:

Fundamentos de Informática

Ficheros conceptos. Manejo de ficheros en C. Apertura del fichero Función fopen: nombre del fichero. Apertura del fichero Función fopen

Informática PRÀCTICA 9 Curs Práctica Nº 9: Rango y precisión de representación de números en el ordenador.

Capítulo 9. Lectura y escritura de ficheros

ENTRADA/SALIDA. Relación Programa - Sistema Operativo - Hardware

1.1. Gramática Léxica

Por ejemplo, para declarar un arreglo de enteros llamado a con diez elementos se hace de la siguiente forma:

INTRODUCCIÓN AL LENGUAJE DE PROGRAMACIÓN C

Lenguaje de Programación: C++ ARCHIVOS I/O

Tema 1. Ficheros FUNDAMENTOS DE PROGRAMACIÓN II. Profesor: Fernando Pereñíguez García. Escuela Politécnica

Tema 11: Manejo de cadenas en C

Caracteres y Cadenas. Funcionamiento y algunas funciones para su manipulación

Fundamentos de Informática

Tipos de Datos en C. Palabras reservadas en C

MIS. Lizbeth Alejandra Hernández González

Cadenas de caracteres. 1. Definición 2. Funciones para manejo de cadenas

Prof. Dr. Oscar Bruno SSL CLASE 2

Formatos para prácticas de laboratorio

Entrada y salida en C. Informática II

Archivos. Conceptos SESION 13

o Archivos secuenciales: imitan el modo de acceso de los antiguos ficheros secuenciales almacenados en cintas magnéticas y

Tema 07: Tipos de datos en C & entrada y salida estándar

Objetivos. El alumno conocerá y aplicará el concepto de archivo para el almacenamiento y recuperación de datos persistentes.

UNIDAD ACADÉMICA PROFESIONAL TIANGUISTENCO

UNIDAD IV ESTRUCTURA DE DATOS ESTÁTICAS MATRICES

Archivos. qué es un archivo?

17. Manejo de cadenas <string.h>

Entrada/Salida. Entrada y Salida Estándar

Fundamentos de Informática ETSII. Tema 2: Entrada y Salida de Datos. Ficheros.

Instituto Técnico Jesús Obrero 4to año Programación Profesor: Luis Vallenilla

APELLIDOS NOMBRE GRUPO CALIFICACIÓN FECHA

Programación I Tipos de datos y operadores básicos

Tema 2: La clase string. Índice. Notas. Programación 2. Curso Notas. Definición Declaración Entrada / salida Métodos Operaciones

7.1.1) archivos ) jerarquía de los datos

Guía práctica de estudio 12: Lectura y escritura de datos

Tema: Introducción a las Estructuras de Datos

LEER RECUPERAR EXTRAER DATOS DE FICHEROS O ARCHIVOS EN C. FGETC, GETC, FGETS, FSCANF. EJERCICIOS (CU00538F)

Programación I Ficheros de texto

2. Variables dinámicas

Informática Ingeniería en Electrónica y Automática Industrial

Analista Universitario en Sistemas. Taller de Programación II. Instituto Politécnico Superior STRINGS

7. Manejo de Archivos en C.

TEMA 2. LENGUAJE C. CONCEPTOS BÁSICOS Y PROGRAMACIÓN ELEMENTAL.

Tema 18: Memoria dinámica y su uso en C

Entrada y Salida de Datos. Lectura de archivos.

Archivos de números. Tema 10c. Archivos de números. Archivos de números. Archivos mixtos. Archivos mixtos. Manejo de archivos de datos en C

Programación I Funciones

Tema 3. Estructuras de control

Informática Ingeniería en Electrónica y Automática Industrial

Lenguaje C Entrada y Salida de Datos. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 2

Algoritmos y estructuras de datos

Estructuras de datos: vectores en C. Clase 7 y 8 Introducción a la Computación Patricia Borensztejn

Formato para prácticas de laboratorio

Laboratorio de Arquitectura de Redes. Entrada y salida por archivos en lenguaje C

Estructuras de Datos Estáticas. Diseñar y programar en lenguaje C soluciones utilizando estructuras de datos estáticas

Arrays, Matrices y Cadenas

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 1

Memoria Dinámica. Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez

GESTIÓN DE MEMORIA DINÁMICA EN C 1. Creación y destrucción de variables dinámicas

Programación I Ficheros de texto

PROGRAMACIÓN EN C. Introducción a C. Estructura de un Programa C

Repaso 03: Manejo de Archivos en C

Diagrama de transiciones del autómata. Tabla de transiciones

Cadena de caracteres. 1. Fundamentos de cadenas y caracteres

Entrada/Salida de Archivos

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Transcripción:

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C Sesión 3 Contenidos: 1. Funciones de entrada/salida 2. Manejo de ficheros 3. Gestión dinámica de memoria 4. Otras funciones de interés Ejercicios

Algoritmos y Estructuras de Datos 2/10 Escribir por pantalla: printf 1. Funciones de entrada/salida printf ( <cadena> ); printf ( <cadena con formato>, <expresión 1>, <expresión 2>,...); printf(" Buenos días!"); printf("un entero: %d y un real: %f\n", 27*12, 3.1416); Especificación de formato en printf: % [flags] [width] [.prec] [F N h l L] caracter_tipo Caracteres de tipo: d, i (decimal), o (octal), u (unsigned), x, X (hexadecimal), f (float con la forma [-]dddd.dddd), e, E, (float con la forma [-]d.dddd e[+/-]ddd), g, G (float inteligente ), c (char), s (string), p (puntero). sprintf. Igual que printf, pero en lugar de escribir en pantalla escribe el resultado en una cadena (el primer parámetro). char resultado[100]; sprintf(resultado, "Probando sprintf con el número %u.\n", -1); printf(resultado); Leer de teclado: scanf Formato parecido a la función printf. int scanf ( <cadena con huecos>, &<variable1>, &<variable2>,...); int i, j, n; float r; char cadena[20]; n= scanf("%d", &i); Lee de teclado un entero y lo guarda en i n= scanf("%d %f", &j, &r); Lee un entero (en j) y un real (en r) n= scanf("%s", cadena); Lee una cadena (hasta el primer espacio) El valor devuelto por scanf indica el número de huecos leídos. Los especificadores de formato son los mismos que para printf. sscanf. El equivalente a scanf, pero en lugar de leer de teclado lee los caracteres de una cadena (el primer parámetro). char entrada_simulada[100]= " 26 88.3 92"; int a, b; float g; sscanf(entrada_simulada, "%d %f %d", &a, &g, &b); putchar(char c). Escribe un carácter por pantalla. Equivale a: printf("%c", c) char getchar(void). Lee un carácter de teclado. Equivale a:

Algoritmos y Estructuras de Datos 3/10 (scanf("%c", &c), c) Ejemplo. #include <stdio.h> main() { int i, n; float f; char cadena[30]; printf("introduce un entero, un float y una cadena:"); /* Probar distintas posibilidades en la siguiente línea */ n= scanf("%d %f %s", &i, &f, cadena); /* Adaptando también este printf, claro */ printf("huecos leídos: %d\nvalores: %d, %f, %s \n", n, i, f, cadena); Ojo: normalmente la salida estándar es la pantalla y la entrada estándar el teclado. Pero se puede utilizar redirección de entrada y salida. >> gcc ejer1.c o ejer1.out Compilamos el programa de ejemplo >>./ejer1.out Ejecutamos. E/S: teclado/pantalla >>./ejer1.out > res.txt Ahora la salida va al fichero res.txt >>./ejer1.out < in.txt Aquí la entrada está en el fichero in.txt >>./ejer1.out >res.txt <in.txt La entrada estándar, salida estándar y salida de error estándar también se pueden manejar como ficheros (con los nombres stdin, stdout y stderr) con las funciones que veremos a continuación.

Algoritmos y Estructuras de Datos 4/10 2. Manejo de ficheros Los tipos y funciones necesarios para el manejo de ficheros están definidos en la librería stdio.h. La librería stdio.h define el tipo FILE (ojo, en mayúsculas). Para usar ficheros debemos usar punteros al tipo FILE. #include <sdtio.h> FILE *f, *g; Operaciones con ficheros: o Abrir un fichero: fopen o Leer/escribir en un fichero: fprintf, fscanf, getc, putc, fgets, fputs, fread, fwrite o Moverse a un punto: fseek o Comprobar si se ha llegado al final: feof o Cerrar un fichero: fclose Abrir un fichero: fopen FILE * fopen ( char *nombre, char *modo ) o Valor devuelto: devuelve un puntero al fichero abierto. Si no se puede abrir devuelve NULL. o Modo de acceso: de tipo cadena Fichero de texto Fichero binario Abrir sólo lectura "r" "rb" Crear y abrir para escritura "w" "wb" Abrir para añadir al final "a" "ab" Abrir para lectura/escritura "r+" "r+b" Crear y abrir para lectura/escritura "w+" "w+b" Abrir o crear para añadir "a+" "a+b" Cerrar un fichero: fclose int fclose ( FILE *fichero ). Devuelve EOF si hubo algún error. Leer/escribir en un fichero. fprintf, fscanf. Igual que printf y scanf pero en un fichero, que se pasa como primer parámetro. FILE *f; int n; f= fopen("prueba", "r+"); if (!f) {printf("error. No puedo..."); return; fprintf(f, "Hola número %d", n); fscanf(f, "%d", &n); fgetc(file *f), fputc(int c, FILE *f). Leer o escribir un carácter en un fichero. Devuelven la constante EOF si hay un error. char c; while ((c= fgetc(f))!= EOF)

Algoritmos y Estructuras de Datos 5/10 printf("leído: %c\n", c); fgets, fputs. Leer o escribir una línea de texto de un fichero. Recordar que scanf("%s",...) lee una cadena pero acabando en el primer espacio en blanco (tabulador, intro o espacio). int fputs (char *cadena, FILE *fichero) Escribe la cadena cadena hasta el final de la misma (carácter '\0'). Devuelve EOF si ha ocurrido un error. char *fgets (char *cadena, int max, FILE *fichero) Lee la siguiente línea del fichero en cadena, acabando en un final de línea (carácter '\n'). Devuelve NULL si ha ocurrido un error. fread, fwrite. Leer o escribir en un fichero en modo binario. unsigned fread(void *ptr, unsigned size, unsigned n, FILE *fichero) Lee del fichero un bloque de size*n bytes y los almacena a partir de la posición apuntada por ptr. Se supone que size es el tamaño del tipo de datos a leer y n el número de datos. Devuelve el número de datos leídos (si no hay error, debería ser igual a n). unsigned fwrite(void *ptr, unsigned size, unsigned n, FILE *fichero) Escribe en el fichero un bloque de size*n bytes, que se encuentran a partir de la posición apuntada por ptr. Se supone que size es el tamaño del tipo de datos a escribir y n el número de datos. Devuelve el número de datos escritos (si no hay error, debería ser igual a n). fseek. Moverse a un punto concreto de un fichero. int fseek(file *fichero, long offset, int modo) Permite moverse a una posición cualquiera dentro de un fichero. La posición nueva está dada por offset (desplazamiento, en bytes) a partir de la posición dada por modo: SEEK_SET (=0) desde el comienzo del fichero; SEEK_CUR (=1) desde la posición actual; SEEK_END (=2) desde el final del fichero. Función de consulta: long int ftell (FILE *fichero). feof. Comprobar si se ha llegado al final de un fichero. int feof(file *fichero) Devuelve true (valor distinto de 0) si hemos llegado al final del fichero o false (valor 0) en caso contrario.

Algoritmos y Estructuras de Datos 6/10 Ejemplo. #include <stdio.h> #include <stdlib.h> /* Función random() */ #include <time.h> /* Función time() */ int main() { FILE *e, *s; char *nombre= "ejemplo.txt"; int n, m, total= 0; if (!(e= fopen(nombre, "w"))) { printf("error. No se puede crear %s\n", nombre); return 1; srandom(time(null)); /* Inicializar generador de random */ fprintf(e, "%d %d\n", random()%10, random()%4); if (fclose(e)==eof) { printf("error. No se puede cerrar %s\n", nombre); return 2; if (!(s= fopen("ejemplo.txt", "r"))) { printf("error. No se puede abrir %s\n", nombre); return 3; while (!feof(s)) { total++; if (fscanf(s, "%d %d\n", &n, &m)==2) printf("real Murcia: %d Real Madrid: %d\n", n, m); else printf("el fichero no tiene el formato esperado\n"); printf("realizados %d pronósticos.\n", total); if (fclose(s)==eof) { printf("error. No se cerrar el fichero %s\n", nombre); return 4; return 0; Probar distintas posibilidades en la línea señalada por:, en lugar de "w" poner "a", "r", "r+", "w+",... Cuál es el resultado?

Algoritmos y Estructuras de Datos 7/10 3. Gestión dinámica de memoria Se puede reservar memoria en tiempo de ejecución. Las funciones para reserva de memoria están en: stdlib.h Toda la memoria reservada debe ser liberada antes de acabar. Es decir, no hay liberación automática de memoria. El manejo de memoria dinámica se hace usando punteros. int *arraydimanico; float **matrizdinamica= NULL; Reserva de memoria: malloc void * malloc (unsigned tamano) o Reserva tamano bytes de memoria y devuelve un puntero a la zona reservada. arraydinamico = (int *) malloc (100*sizeof(int)); o Devuelve NULL si no se ha podido reservar esa cantidad. o No se inicializa la memoria. o Cómo reservar memoria para matrizdinamica? Reserva e inicialización de memoria: calloc void * calloc (unsigned ndatos, unsigned size) o Reserva ndatos*size bytes de memoria y devuelve un puntero a la zona reservada. Se supone que size es el tamaño del tipo de datos a escribir y ndatos el número de datos. arraydinamico = (int *) calloc (100, sizeof(int)); o Devuelve NULL si no se ha podido reservar esa cantidad. o Se inicializa la memoria reservada con 0. Relocalizar de memoria: realloc void * realloc (void *ptr, unsigned tamano) o Redimensiona la cantidad de memoria reservada previamente a la nueva cantidad de bytes dada en tamano. Liberar memoria: free void free(void *ptr) o Libera una zona de memoria reservada previamente. No usar si ptr == NULL.

Algoritmos y Estructuras de Datos 8/10 Ejemplo. #include <stdio.h> #include <stdlib.h> char *memoria= NULL; int main() { char c; long i, tam= 0; do { tam+= 1000000; memoria= (char *) malloc (tam); if (!memoria) { printf("error. Imposible reservar más memoria.\n"); return 0; printf("reservados %ld bytes...\n", tam); for (i= 0; i<tam; i++) memoria[i]= (char) i; printf("pulse s para seguir saturando la máquina.\n"); while ((c= getchar())=='\n'); free(memoria); while (c=='s' c=='s'); return 0; Otro ejemplo: páginas 310 y 311 del texto guía.

Algoritmos y Estructuras de Datos 9/10 4. Otras funciones de interés Con cadenas: string.h stdlib.h Nombre Sintaxis Explicación strlen unsigned strlen(char *s) Devuelve la longitud de la cadena. strcpy char *strcpy(char *des, char *src) Copia la cadena src en des y devuelve des. strcat char *strcat(char *des, char *src) Concatena a des la cadena src y devuelve des. Compara las dos cadenas. El resultado es: 0 si son strcmp int strcmp(char *s1, char *s2) iguales; <0 si s1<s2 ; y >0 si s1>s2. Convierte una cadena a un entero. Otras funciones atoi int atoi(char *s) relacionadas: atol, atof, itoa, itol,... Con memoria: string.h Nombre Sintaxis Explicación memcpy memcmp memset void *memcpy(void *dest, void *src, unsigned n) void *memcmp(void *s1, void *s2, unsigned n) void *memset(void *s, int c, unsigned n) Con caracteres: ctype.h Copia n bytes desde la posición apuntada por src hasta la apuntada por dest. Ver también memmove. Compara n bytes de s1 y de s2. El resultado es como en strcmp. Escribe en los n bytes de s el valor (byte) c. Nombre Sintaxis Explicación isalpha int isalpha(int c) Devuelve true si el carácter c es una letra. isupper int isupper(int c) Devuelve true si el carácter c es una letra mayúscula. islower int isulower(int c) Devuelve true si el carácter c es una letra minúscula. isspace int isspace(int c) Devuelve true si el c es un espacio, tabulador o \n. toupper int toupper(int c) Devuelve el carácter c en mayúsculas. tolower int tolower(int c) Devuelve el carácter c en minúsculas. Otras: stdlib.h Nombre Sintaxis Explicación Ejecuta un comando del sistema operativo. system int system(char *command) Devuelve 0 si no hay error. Cierra todos los ficheros y termina la exit void exit(int status) ejecución del programa, devolviendo status.

Algoritmos y Estructuras de Datos 10/10 Ejercicios 1. Busca en la ayuda (man) el significado y la sintaxis de las siguientes operaciones, y las librerías donde se encuentran. Escribe algún programa sencillo que las use. a) perror b) opendir c) readdir d) gettimeofday e) excel f) qsort g) getline 2. Escribe un procedimiento que reserve memoria para una matriz de reales de tamaño a b, y otro que multiplique dos matrices de dimensiones compatibles. 3. Usando el procedimiento anterior, escribe un programa que multiplique dos matrices A y B leídas de ficheros, la primera de tamaño n m y la segunda de tamaño m p. Las matrices deben leerse cada una de un fichero distinto y el resultado debe estar en otro fichero. El formato del fichero es el siguiente: en la primera línea habrán 2 enteros, indicando el tamaño de la matriz en cada dimensión. A continuación vienen las filas de la matriz, cada una en una misma línea. Los valores son números reales. El resultado debe estar en otro fichero con el mismo formato. Por ejemplo, un fichero de definición de una matriz podría ser el siguiente: 3 4 1 0.1 0 1.2 0 1.2 3.4 0.3 2.8 2.4 5.3 5.2 Los nombres de los ficheros serán los argumentos del programa o (si no existen) se solicitarán a través del teclado.