FUNDAMENTOS DE PROGRAMACIÓN Sabino Miranda Jiménez Universidad Autónoma del Estado de México (UAEM) [email protected] UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Manejo de Archivos Memoria volátil (RAM), escasa y costosa Almacenar datos persistentes en disco UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Manejo de Archivos en C • Provee flujos de datos intermedios (buffer) para el acceso a archivos • Flujos de datos intermedios Acceso por medio de apuntadores Tipo de dato FILE en stdio.h #include <stdio.h> FILE *ptr; UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Manejo de Archivos: apertura • Funciones para la administración • fopen() Abre un flujo de datos • Definición. FILE *fopen(char *nombre, char *modo); Parámetros: ▫ Nombre del Archivo ▫ Modo de apertura FILE *f; f=fopen("Luvina.txt","r"); UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Manejo de Archivos: apertura (2) • Modos de apertura de archivos Modo Descripción r Sólo lectua w Crea un archivo para escritura, destruye cualquier archivo existente a Añadir, lo crea si no existe r+ Lectura/escritura de un archivo existente w+ a+ Crea archivo de lectura/escritura. Destruye el archivo si existe Añadir. Crea un archivo si no existe UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Manejo de Archivos: cierre • Funciones para la administración • fclose() Cierra un flujo de datos • Definición. int *fclose(FILE *archivo); Parámetros: ▫ Apuntador de tipo FILE al archivo FILE *f; f=fopen("Luvina.txt","r"); …. fclose(f); UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Funciones para administración feof() Verifica el indicador de fin de archivo ▫ int feof(FILE *fichero); fgets() Lee cadenas de caracteres hasta n-1 o salto de línea ▫ char *fgets(char *cadena, int n, FILE *fichero); fputs() Escribe una cadena a un archivo sin \n o \0 ▫ int fputs(const char *cadena, FILE *stream); UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Funciones para administración fprintf() Similar a printf ▫ int fprintf(FILE *archivo, const char *formato, ...); fscanf() Similar a scanf ▫ int fscanf(FILE *archivo, const char *formato, ...); fseek() posiciona el indicador en el byte indicado ▫ int fseek(FILE *archivo, long int desplazamiento, int origen); UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Funciones para administración ftell() Indica la posición actual del archivo long int ftell(FILE *archivo); UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Ejemplo de lectura (1) #include <stdio.h> #define MAX_LINEA 2000 int main(){ FILE *f; char lin[MAX_LINEA]; int i=0; f=fopen("Luvina.txt","r"); while(!feof(f)){ fgets(lin , MAX_LINEA , f); printf("Linea %d: %s\n", i , lin); i++; } fclose(f); return 0; } UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Ejemplo de lectura (2) #include <stdio.h> #define MAX_LINEA 2000 int main(){ FILE *f; char lin[MAX_LINEA]; int i=0; f=fopen("Luvina.txt" , "r"); while(!feof(f)){ fgets(lin , MAX_LINEA , f); printf("Linea %d: %s\n" , i , lin); i++; if (i>20) { break; } } fclose(f); return 0; } UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Ejemplo de escritura 1 #include <stdio.h> int main(){ FILE *f; char c; int i; int M[10][3]; f=fopen("archivo.txt","w"); printf("Teclee tres números por fila separados por comas\n"); for( i=0 ; i<3; i++){ printf("Fila %d: ",i+1); scanf("%d ,%d, %d“ , &M[i][0] , &M[i][1] , &M[i][2]); fprintf(f,"%d,%d,%d\n", M[i][0] , M[i][1] , M[i][2]); } fclose(f); return 0; } UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Ejemplo de lectura/escritura (1) #include <stdio.h> #define MAX_LINEA 2000 int main(){ FILE *fEntrada,*fSalida; char lin[MAX_LINEA]; int i=0; printf("Procesando texto....\n"); fEntrada=fopen("Luvina.txt","r"); fSalida=fopen("Parte1.txt","w"); while(!feof(fEntrada)){ fgets(lin, MAX_LINEA, fEntrada); fprintf(fSalida, "Linea%d: %s", i+1, lin); i++; if(i>20) { break; } } UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Ejemplo de lectura/escritura (2) fclose(fEntrada); fclose(fSalida); printf("Fin procesamieto....\n"); printf("Registros leidos: %i", i); return 0; } // FIN MAIN UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Ejercicio 1 Desarrollar un programa que lee del teclado líneas de texto y las guarde en un archivo. El usuario dejará de capturar texto hasta que teclee la cadena “FIN”. Definir: Algoritmo Programa en C Ejercicio 2 • Crear un archivo con los datos capturados para un conjunto de empleados: nombre, edad, puesto • Solicitar al usuario cuantos empleados desea capturar. • Cada línea del archivo representa los datos de un empleado. El archivo tiene el siguiente formato nombre|edad|puesto Ejemplo del archivo de salida Juan|32|Programador María|25|administrativo Pedro|38|Analista UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Ejercicio 3 Desarrollar un programa que busque dentro de un archivo de texto una cadena introducida por el usuario y le indique en que línea del archivo se encuentra, si no se encuentra mostrarle un mensaje. Nota: considerar sólo líneas completas Definir: Algoritmo Programa en C UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Manejo de cadenas en C • La administración de cadenas o strings es vital para el manejo de datos. • En C se cuenta con una librería para su manejo ▫ string.h UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Manejo de cadenas Funciones para la administración strstr() localiza la aparición de s2 en s1 char *strstr(const char *s1, const char *s2); retorna: apuntador a la primera aparición null si no la encontró char *ap; ap= strstr(“Hola mundo”, “mundo”); UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Manejo de cadenas strcmp() compara s2 contra s1 int strcmp(const char *s1, const char *s2); retorna: 0 : si s1=s2 > 0 : si s1>s2 < 0 : si s1<s2 int i; i= strcmp(“Barco”, “barca”); // B=66 y b = 98 en ASCII UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Manejo de cadenas strtok() Divide la cadena s1 en segmentos o tokens dependiendo de la cadena s2 (delimitadores) char *strtok(char *s1, const char *s2); La primera llamada a strtok determina la cadena a romper. Las posteriores llamas retornan los demás tokens Retorna: apuntador al comienzo del primer token apuntador null si no se encuentra el primer token UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Ejemplo strtok() #include <stdio.h> #include <string.h> int main() { char s1[] = "El hombre aquel, que hablaba, se quedó callado un rato, mirando hacia afuera"; char s2[] = ","; char *ptr; printf( "s1=%s\n", s1 ); ptr = strtok( s1, s2 ); // Primer token while(ptr!= NULL ) // Posteriores llamadas { printf( "Token: %s\n", ptr ); ptr = strtok(NULL, s2 ); } return 0; } UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO Ejercicio 1 Desarrollar un programa que lea del teclado una línea de texto y la seccione en tokens (usar el espacio como delimitador). Los tokens se guardarán en un arreglo de caracteres para su posterior impresión. Definir: Algoritmo Programa en C