Archivos & Cadenas CURSO DE PROGRAMACIÓN EN C Centro de Investigación y de Estudios Avanzados del IPN. CINVESTAV - Tamaulipas. Febrero 2016 [Curso de programación en C] - Archivos & Cadenas 1/17
Archivos de Datos Muchas aplicaciones requieren escribir o leer información de un archivo de datos. Los archivos de datos permiten almacenar información de modo permanente y acceder y modificar la misma cuando sea necesario. En C existe un conjunto de funciones de biblioteca para crear y procesar archivos de datos, algunas de las cuales están contenidas en stdio.h [Curso de programación en C] - Archivos & Cadenas 2/17
Apertura de Archivos de Datos Cuando se trabaja con archivos de texto, el primer paso es establecer un área de buffer, donde la información se almacena temporalmente mientras se está transfiriendo entre la memoria de la computadora y el archivo de datos. El área de búffer se establece escribiendo: FILE *ptvar; FILE ptvar Tipo especial de estructura que establece el área de búffer Puntero a archivo secuencial Un archivo debe ser abierto antes de ser creado o procesado, esto asocia el nombre del archivo con el área de búffer Se debe especificar cómo se va a usar el archivo, sólo para lectura, sólo para escritura, o para lectura/escritura [Curso de programación en C] - Archivos & Cadenas 3/17
Tipos de Apertura de Archivos de Datos Para abrir un archivo se usa la función de biblioteca fopen, la cual se escribe típicamente como: ptvar = fopen(nombre-archivo, tipo-archivo); tipo-archivo r Abrir un archivo existente sólo para lectura w Abre un archivo nuevo sólo para escritura a Abrir un archivo existente para añadir información al final r+ Abrir un archivo existente tanto para lectura como para escritura w+ Abrir un archivo nuevo para lectura y escritura a+ Abrir un archivo existente para leer y añadir w, w+ Si existe un archivo con nombre-archivo especificado, será destruido y creado uno nuevo en su lugar. a, a+ Se creará un archivo nuevo si no existe un archivo con el nombre-archivo especificado. [Curso de programación en C] - Archivos & Cadenas 4/17
Tipos de Apertura de Archivos de Datos La función fopen devuelve un puntero al principio del área de buffer asociada al archivo, se devuelve NULL si no se puede abrir el archivo. Un archivo de datos debe cerrarse al final del programa, esto puede realizarse con la función de biblioteca fclose. La sintaxis es: fclose (ptvar); Apertura y cierre de un archivo nuevo para escritura #include<stdio.h> int main(){ FILE *pt; pt = fopen( Datos.txt, w );... fclose(pt); return 0; } [Curso de programación en C] - Archivos & Cadenas 5/17
Error en la Apertura de un Archivo En la siguiente condición se trata de abrir para lectura y escritura un archivo de datos previamente existente llamado Muestra.txt. Se mostrará un mensaje de error si no se encuentra este archivo, en otro caso, el archivo de datos se abrirá y procesará. if ((pt = fopen( Muestra.txt, r+ )) == NULL) printf( \nerror - No se puede abrir el archivo indicado\n ); En caso de no producir error, pt apunta al área de buffer asociada con el archivo Muestra.txt. Todas las subsiguientes instrucciones de proceso accederán al archivo mediante el puntero pt en lugar del nombre del archivo. [Curso de programación en C] - Archivos & Cadenas 6/17
Archivo para Escritura - Procesamiento por Caracter Un archivo puede crearse con w, w+, a, a+, dependiendo del propósito requerido. Archivo para escritura (w) #include<stdio.h> #include<ctype.h> int main(){ FILE *pt; char c; if ((pt = fopen( Datos.txt, w )) == NULL){ printf( \nerror - No se puede crear el archivo\n ); exit(-1); } printf( Escriba un texto y termine con <enter>: ); do{ putc(toupper(c = getchar()), pt); }while(c!= \n ); fclose(pt); return 0; } [Curso de programación en C] - Archivos & Cadenas 7/17
Archivo para Lectura - Procesamiento por Caracter Un archivo puede abrirse para sólo lectura con r. Archivo para lectura (r) #include<stdio.h> #include<ctype.h> int main(){ FILE *pt; char c; if ((pt = fopen( Datos.txt, r )) == NULL){ printf( \nerror - No se puede abrir el archivo\n ); exit(-1); } do{ putchar(c = getc(pt)); }while(c!= \n ); fclose(pt); return 0; } [Curso de programación en C] - Archivos & Cadenas 8/17
Archivo para Escritura - Procesamiento por Cadena de Caracteres Archivo para escritura (w) #include<stdio.h> #include<string.h> int main(){ FILE *pt; char texto[50]; if ((pt = fopen( Nombres.txt, w )) == NULL){ printf( \nerror - No se puede abrir el archivo\n ); exit(-1); } printf( Escriba el texto en una nueva línea\n ); printf( Escriba \ FIN\ para terminar\n\n ); do{ scanf( %[ˆ\n],texto); getchar(); if(strcmp(texto, FIN )!=0) fprintf(pt, %s\n,texto); }while(strcmp(texto, FIN )!=0); fclose(pt); return 0; } [Curso de programación en C] - Archivos & Cadenas 9/17
Archivo para Lectura - Procesamiento por Cadena de Caracteres Archivo para lectura (r) #include<stdio.h> #include<string.h> int main(){ FILE *pt; char texto[50]; if ((pt = fopen( Nombres.txt, r )) == NULL){ printf( \nerror - No se puede abrir el archivo\n ); exit(-1); } while(!feof(pt)){ fscanf(pt, %[ˆ\n],texto); printf( %s\n,texto); fscanf(pt, %[\n],texto); }; fclose(pt); return 0; } [Curso de programación en C] - Archivos & Cadenas 10/17
Arrays y Cadena de Caracteres Una cadena de caracteres puede ser representada por un array unidimensional de caracteres. Cada caracter de la cadena será almacenado en un elemento del array. Algunos problemas requieren que las cadenas de caracteres se procesen como entidades completas. Tales problemas pueden simplificarse utilizando funciones especiales de biblioteca orientadas a cadenas de caracteres. La mayoría de los compiladores de C incluyen funciones de biblioteca que permiten comparar, copiar o concatenar cadenas de caracteres. [Curso de programación en C] - Archivos & Cadenas 11/17
[Curso de programación en C] - Archivos Pone & Cadenas todos los caracteres de s a c ex- 12/17 Arrays y Cadena de Caracteres Funciones Propósito Biblioteca ANSI strcmp(s1,s2) Compara dos cadenas de caracteres lexicográficamente. Devuelve un valor negativo si s1 < s2; 0 si s1 y s2 son idénticas; y un valor positivo si s1 > s2 string.h strcmpi(s1,s2) strcpy(s1,s2) strlen(s) strcat(s1,s2) Compara dos cadenas de caracteres lexicográficamente, sin diferenciar mayúsculas de minúsculas. Devuelve un valor negativo si s1 < s2; 0 si s1 y s2 son idénticas; y un valor positivo si s1 > s2 Copia la cadena de caracteres s2 en la cadena s1 Devuelve el número de caracteres de una cadena Concatena la cadena de caracteres s2 a s1 y agrega string.h string.h string.h string.h
Paso de Argumentos en la Función main La ejecución de un programa en C comienza por la función main. En ocasiones, es requerido que los programas acepten una serie de parámetros al iniciar su ejecución y especificar estos valores desde la línea de comandos. Para este propósito, la función main tiene los siguientes parámetros: main(int argc, char *argv[]); Argumento argc argv[0] argv[1] argv[argc-1] argv[argc] Descripción Número de argumentos pasados a la función Nombre del programa 1er argumento después del nombre del programa Último argumento NULL [Curso de programación en C] - Archivos & Cadenas 13/17
Paso de Argumentos en la Función main Suponga que quiere ejecutar en el programa «Convertir» para obtener la equivalencia un número decimal a uno de base n-ádica y lo quiere hacer mediante línea de comandos../convertir -NUM 168 -BASE 2 Argumento Valor argc 5 argv[0]./convertir argv[1] -NUM argv[2] 168 argv[3] -BASE argv[4] 2 argv[5] NULL Para transformar un número recibido en argv a su tipo correspondiente se puede hacer uso de las funciones de biblioteca: numdecimal = atoi(argv[2]); [Curso de programación en C] - Archivos & Cadenas 14/17
Ejercicios para aplicar los temas (Archivos) - Codificar un programa que reciba como entrada 2 archivos y compare el contenido de ambos. Los archivos contienen números enteros, uno en cada línea. Características adicionales: El programa debe tener el patrón de ejecución./archivoexe -file NombreArch1 NombreArch2 Si el número de parámetros es diferente de 4, desplegar: El número de parámetros debe ser 4 Si el patrón de entrada no coincide con el especificado, desplegar: La entrada debe ser:./archivoexe -file NombreArch1 NombreArch2 Si el contenido de los archivos difiere, desplegar: Valores diferentes en Línea #: val 1 val 2 # se sustituye por el número de línea val 1 val 2 por los valores en cada archivo. En todos los casos de error, así como en los que no coincidan los datos, se debe terminar la ejecución del programa Si el contenido de ambos archivos coincide, desplegar: El contenido del ambos archivos coincide [Curso de programación en C] - Archivos & Cadenas 15/17
Ejercicios para aplicar los temas (Cadenas) - Codificar un programa con las siguientes características: Recibir una cadena de entrada mediante línea de comandos que acepte todo tipo de caracteres excepto enter \n. Solicitar memoria dinámica del tamaño de la cadena de entrada (considerando los espacios en blanco y el \0 ) y copiar en ésta la información de la cadena introducida. Declarar en el main 5 variables locales de tipo entero para contabilizar la cantidad de vocales, consonantes, números, espacios en blanco y otros caracteres en la cadena de entrada. Pasar a una función (de tipo void) la cadena de entrada y las 5 variables para contabilizar los diferentes tipos de caracteres. El paso de argumentos debe ser por referencia. Modificar los contadores de los tipos de caracteres en la función y regresar al punto donde fue «llamada». Imprimir en una línea nueva el valor de los contadores de los tipos de caracteres. [Curso de programación en C] - Archivos & Cadenas 16/17
Ejercicios para aplicar los temas (Punteros) Ejemplo de entrada:./cadena 0.5 es un flotante Ejemplo de salida: Vocales: 8 Consonantes: 10 Números: 2 Espacios en blanco: 4 Otros caracteres: 1 [Curso de programación en C] - Archivos & Cadenas 17/17