Tema11. Manejo de Archivos

Anuncio
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
Descargar