Documente Academic
Documente Profesional
Documente Cultură
Integrantes: - Bazn Soto, Jos - Huraca Berrospi, Angelo - Urbina Quispe, Jaime Profesor: Crdova Neri Teodoro
2013
INDICE
I. Introduccin Importancia del software II. Fundamento terico
2.1 Historia del Lenguaje c 2.2 Historia del Lenguaje C++ 2.3 Programacin estructurada 2.3.1 Estructuras de Control 2.3.2 Estructuras Repetitivas 2.3.3 Arreglos: *Arreglos *Cadena de Caracteres *Matrices 2.3.4. Archivos
I. Introduccin
El avance en el campo de la Tecnologa de la informacin mejora realmente la vida de las personas. Las habilidades y el trabajo de Los profesionales de TI realmente han trado grandes cambios y las empresas estn disfrutando de los privilegios, que llegan a servir en el trabajo, realizado por los profesionales de TI. Usted ver que el software de innumerables se vende en el mercado, que han hecho la vida de los hombres de Negocios, ms fcil que nunca. Entre todos los otros tipos de software, Software mdico es uno de los ms prominentes y eficiente. Este software ha ayudado a mejorar la eficiencia en el trabajo y la funcionalidad de las instituciones mdicas, incluyendo clnicas y los hospitales. De software mdico pueden introducir cambios importantes y destacados en el trabajo constante de los mdicos y el personal, que trabajan en Hospitales y Clnicas. Las ventajas de este software puede ser igualmente proporcionada a los pacientes. Que puede traer la paz en la vida de los mdicos y pacientes y no habr posibilidades de bastante menos de cualquier tipo de problema, en el funcionamiento de hospitales y clnicas. Los mdicos llevan una vida ocupada y agitada. No tienen mucho tiempo para mantener el registro de sus pacientes y para registrar la historia de los pacientes es un trabajo de mucho tiempo. Si va a contratar a un empleado para mantener el registro de los pacientes, incluso en ese caso sera una prdida de tiempo y trabajo caro. En lugar de pagar a un empleado, slo para este trabajo, el que tiene que entender la importancia de la instalacin de software mdico. No slo va a ayudar en el mantenimiento de los datos de los pacientes, sino que tambin ayudar en el mantenimiento de la facturacin de su hospital o clnica.
El lenguaje C posee un nmero reducido de palabras reservadas (tan solo 32) que define el estndar ANSI-C. Estas palabras reservadas pueden verse en la tabla siguiente:
Solamente con estas tres estructuras se pueden escribir todos los programas y aplicaciones posibles. Si bien los lenguajes de programacin tienen un mayor repertorio de estructuras de control, stas pueden ser construidas mediante las tres bsicas citadas.
Historia
Fundamentacin terica
El teorema del programa estructurado proporciona la base terica de la programacin estructurada. Seala que tres maneras de combinar programas son suficientes para expresar cualquier funcin computable: secuencia, seleccin e iteracin. Esta observacin no se origin con el movimiento de la programacin estructurada. Estas estructuras son suficientes para describir el ciclo de instruccin de una unidad central de procesamiento, as como el funcionamiento de una mquina de Turing. Por lo tanto un procesador siempre est ejecutando un "programa estructurado" en este sentido, incluso si las instrucciones que lee de la memoria no son parte de un programa estructurado. Sin embargo, los autores usualmente acreditan el resultado a un documento escrito en 1966 por Bhm y Jacopini, posiblemente porque Dijkstra haba citado este escrito. El teorema del programa estructurado no responde a cmo escribir y analizar un programa estructurado de manera til. Estos temas fueron abordados durante la dcada de 1960 y principio de los aos 1970, con importantes contribuciones de Dijkstra, Robert W. Floyd, Tony Hoarey y David Gries.
if( expresion ) { statement ; ... } La expresion debe ir entre parntesis y dar un valor numrico. Si el valor es no cero, las expresiones que van entre llaves son ejecutadas. Tambin se puede utilizar un bloque if-else: if( expresion ) { contenidos bloque 1 ; } else { contenidos bloque 2 ; } Bucles En C++ hay tres clases de bucles: Bucle while while( expresion ) { statement ; // cuerpo del bucle ... } El bucle while ejecuta el cuerpo del bucle repetidamente mientras la expresion sea distinta de cero (sea verdadera). El test se hace antes de ejecutar el cuerpo del bucle, lo que significa que se este se ejecuta cero o ms veces. Se debe utilizar un bucle while cuando es posible que el cuerpo del bucle no sea ejecutado. Por ejemplo, para leer y procesar el contenido de un fichero de tamao desconocido. Bucle do-while do { statement ; // cuerpo del bucle do-while ... } while ( expresion ); El cuerpo del bucle se ejecuta repetidamente mientras la expresion es distinta de cero (verdadera). El test se hace despus de ejecutar el cuerpo del bucle, por lo que este se ejecuta al menos una vez. Debe utilizarse este tipo de bucles cuando el cuerpo debe ser ejecutado al menos una vez. En particular, en aquellos casos en que el bucle calcula un valor que es necesario para la condicin de terminacin. Por ejemplo, los clculos iterativos que terminan cuando se da una condicin de convergencia, cuando una expresion calculada dentro del bucle es menor que un determinado valor. Bucle for for ( init-statement; expresion de continuacin; expresion de incremento ) { statement ; // cuerpo del bucle for ... }
break y continue break termina la ejecucin del bucle en que se encuentra. continue hace que el bucle pase directamente a la siguiente iteracin. Ambos comandos deben utilizarse lo menos posible
Concepto General
Un ciclo puede definirse como una estructura que nos permite repetir o iterar un conjunto de instrucciones y que tiene las siguientes caractersticas:
El conjunto de instrucciones a repetir dentro del ciclo debe ser finito La cantidad de veces que se repita dicho conjunto de instrucciones tambin debe ser finita. En algunos casos esta cantidad de veces va a depender de una condicin explcita y en otros casos va a depender de una condicin implcita. Una condicin es explcita cuando depende solamente de la misma ejecucin del programa sin que sea importante la participacin del usuario. Asimismo una condicin es implcita cuando depende solamente de la voluntad del usuario y por lo tanto la cantidad de iteraciones o repeticiones del ciclo podra llegar a ser diferente cada vez pues sera posible que cambiara con cada usuario. Deben estar claramente demarcados el inicio y el fin del ciclo. En los casos en los cuales solo exista una instruccin a iterar, no sern necesarias dichas marcas. Dentro de un ciclo podr ir cualquiera de las otras estructuras, incluyendo otros ciclos.
Tipos de Ciclos
A continuacin se describe la estructura de construccin de cada uno de los ciclos tal como son concebidos por la mayora de lenguajes de programacin y
posteriormente se utilizaran para representar el mismo algoritmo con cada una de las estructuras.
Su forma de ejecucin es muy sencilla: Mientras se cumpla que la condicin sea Verdadera entonces se ejecutar el Cuerpo del Ciclo. De igual forma tambin se podra decir que el Cuerpo del Ciclo se repetir tantas veces como lo permita la condicin o mientras dicha condicin sea Verdadera. En condiciones normales la cantidad de veces que se repita el cuerpo del ciclo ser siempre una cantidad finita y deber existir, dentro del mismo cuerpo del ciclo, una o ms instrucciones que hagan que en algn momento la condicin sea Falsa. El ciclo while se puede describir de la siguiente forma: cuando el computador encuentra la estructura while verifica la condicin del ciclo, si la condicin es verdadera se ejecutan las instrucciones al interior del ciclo, luego de ejecutar la ltima condicin del ciclo se vuelve a evaluar la condicin, s contina siendo cierta se vuelve a ejecutar el bloque de instrucciones del ciclo. Cuando la condicin se hace falsa el computador se salta el bloque de instrucciones del ciclo y contina con la ejecucin del resto de instrucciones del programa.
2.3.3 Arreglos
Arreglos y Matrices 1. Arreglos
Un arreglo es una estructura de datos, o ms tcnicamente, un espacio de memoria que permite almacenar una coleccin de elementos, todos del mismo tipo. Conviene imaginar un arreglo como una secuencia contigua de celdas (espacios de memoria), o casillas, en cada una de las cuales se puede guardar un elemento de la coleccin. Adems, es usual dibujarlo como lo ilustra la figura siguiente: |0|1|2|3|4|5|6| Esta figura representa un arreglo de siete casillas cada una de las cuales se puede utilizar para guardar un dato. La dimensin o tamao de un arreglo es el nmero de casillas que lo conforman. Debe ser claro, entonces, que la figura anterior corresponde a un arreglo de dimensin 7.
Cada una de las casillas de un arreglo tiene asociado un nmero que la identifica de manera nica. A este nmero se le llama ndice o direccin. En la figura anterior, debajo de cada casilla, aparece su ndice. En lenguajes como C, C++ y java, la primera casilla del arreglo tiene ndice 0, la segunda tiene ndice 1, la tercera ndice 2, y as sucesivamente. Es muy importante tener presente que si el arreglo es de dimensin N, la ltima casilla tiene ndice N-1. Los lenguajes de programacin, permiten que el programador declare arreglos de cualquier tipo y prcticamente de cualquier tamao. En el seudolenguaje, un arreglo se declara usando el siguiente formato o plantilla: <NOMBRE>: arreglo [<N>] de <TIPO> En este formato aparecen en maysculas y entre los caracteres < y > los componentes que el programador debe determinar. As por ejemplo, si se quiere declarar un arreglo con nombre letras, de dimensin 15 y que pueda almacenar datos de tipo caracter, se debe escribir la siguiente lnea. letras : arreglo [15] de caracter Volviendo al formato anterior, el programador debe bautizar el arreglo (ponerle un nombre significativo), debe decir cul es su dimensin, y tambin debe decir de qu tipo son los elementos que almacenar ese arreglo. Enseguida se dan algunos ejemplos de declaraciones de arreglos. Si se necesita guardar las ventas diarias de una tienda durante la ltima semana, se puede declarar el siguiente arreglo: ventas : arreglo [7] de real Si se quiere guardar las notas que ha sacado un estudiante en los cinco talleres y en los cinco laboratorios del curso de Programacin de Computadores se pueden declarar los siguientes arreglos: talleres : arreglo [5] de real laboratorios : arreglo [5] de real Si se quiere guardar el valor de las ltimas 12 facturas telefnicas de una casa, se puede declarar el siguiente arreglo: facturasTel : arreglo [12] de real Los ndices se crearon para permitir que el programador se pueda referir, de forma especfica, a una cualquiera de las casillas del arreglo, tanto para guardar un dato en esa casilla, como para obtener el dato guardado. Para referirse a una casilla particular de un arreglo se debe seguir el siguiente formato: <NOMBRE>[<INDICE>] es decir, se debe escribir el nombre del arreglo seguido por el ndice de la casilla entre parntesis cuadrados. Para los siguientes ejemplos, suponga que se declara el arreglo cifras, de la siguiente manera: cifras : arreglo [10] de entero
La siguiente instruccin asigna o guarda el nmero 100 en la primera casilla de este arreglo: cifras[0]:= 100 La siguiente instruccin iterativa guarda 550 en cada una de las ltimas 5 casillas de este arreglo: i:=5 MIENTRAS (i<10) HACER cifras[i]:= 550 i:=i+1 FIN-MIENTRAS
2. Cadenas de caracteres
Los elementos del tipo caracter (tipo char en lenguaje C) se pueden agrupar para formar secuencias que se denominan cadenas de caracteres, o simplemente cadenas. En este texto, y tambin en el texto de un programa en C, las cadenas se delimitan por dobles comillas. Por ejemplo, CH?*$A7! y soy cadena son dos cadenas, la primera formada por 8 caracteres y la segunda por 10. En la memoria del computador una cadena se guarda en un arreglo de tipo caracter, de tal manera que cada smbolo de la cadena ocupa una casilla del arreglo. Sin embargo, se utiliza una casilla adicional del arreglo para guardar un carcter especial que se llama terminador de cadena. En C y en el seudolenguaje este carcter especial es \0. Como lo indica su nombre, la funcin de este carcter especial es indicar que la cadena termina. La longitud de una cadena se define como el nmero de smbolos que la componen, sin contar el terminador de cadena. Es muy importante tener en cuenta que aunque el terminador de cadena no hace parte de la cadena, s ocupa una casilla de memoria en el arreglo. Dado que la representacin de cadenas es mediante arreglos de tipo caracter, aplican todos los conceptos que ya explicaron para esta estructura de datos. Por otra parte, por el hecho de que las cadenas son de uso muy frecuente y generalizado en programacin, en muchos lenguajes se dispone de muchas operaciones (funciones) sobre estas. La siguiente es una lista corta de estas operaciones para el seudolenguaje, en la cual debe suponerse que cad, cad1 y cad2 son nombres de arreglos de tipo caracter. Para determinar si una cadena es menor que otra se usa el orden lexicogrfico, es decir, el mismo que usan los diccionarios. As por ejemplo, casa es menor casita, y esta a su vez es menor que caza. De otra parte, la operacin leerCadena pone automticamente el terminador de cadena, lo mismo que las operaciones copiarCadena y concatenarCadena.
3. Matrices
Una matriz es una estructura de datos, o ms tcnicamente, un espacio de memoria que permite almacenar una coleccin de elementos, todos del mismo tipo. La
diferencia con los arreglos est en que, en las matrices, los elementos no estn organizados linealmente sino que su organizacin es bidimensional, es decir, en filas y columnas. Conviene imaginar una matriz como una organizacin de celdas de memoria, o casillas, en cada una de las cuales se puede guardar un elemento de la coleccin. Adems, es usual dibujarla como lo ilustra la figura siguiente:
Esta figura representa un matriz de cuatro filas (numeradas verticalmente de 0 a 3) y seis columnas (numeradas horizontalmente de 0 a 5). En cada una de las 24 celdas o casillas se puede guardar un dato. La dimensin o tamao de una matriz es el nmero filas por el nmero de columnas. Debe ser claro entonces que la figura anterior es la grfica de una matriz de dimensin 4x6. La numeracin de las filas y las columnas determina que cada una de las casillas de una matriz tiene asociados dos nmeros que la identifican de manera nica. A estos nmeros se les llama ndice de fila e ndice de columna, respectivamente. En el seudolenguaje, y tambin en C y C++, las filas y las columnas se numeran desde 0. Los lenguajes como C y C++, permiten que el programador declare matrices de cualquier tipo y prcticamente de cualquier tamao. En el seudolenguaje, un matriz se declara usando el siguiente formato: <NOMBRE> : matriz [<N>][<M>] de <TIPO> En este formato aparecen en maysculas y entre los caracteres < y > los componentes que el programador puede determinar. As por ejemplo, si se quiere declarar una matriz con nombre mat, de dimensin 15x4 y que pueda almacenar datos de tipo caracter, se debe escribir la siguiente lnea. mat : matriz [15][4] de caracter Segn el formato anterior, el programador debe bautizar la matriz (ponerle un nombre significativo), debe decir cul es su dimensin, y tambin debe decir de qu tipo son los elementos que almacenar. Enseguida se dan algunos ejemplos de declaraciones de matrices.
Si se necesita guardar la informacin relacionada con el tablero de un juego de tic tac toe (el tradicional triqui), se puede declarar la siguiente matriz: tablero: matriz [3][3] de caracter Si se requiere guardar las notas que han sacado 35 estudiantes en los 5 talleres y en los 5 laboratorios del curso de Programacin de Computadores se pueden declarar las siguientes matrices. talleres : matriz [35][5] de real laboratorios : matriz [35][5] de real Note que, en ambas matrices, cada fila guarda las notas de un estudiante del curso. Si se quiere guardar las letras que conforman una sopa de letras, como aquellas que vienen en los pasatiempos, se puede declarar la siguiente matriz. sopa : matriz [10][15] de caracter Note que la sopa de letras ms grande que se puede guardar es de 10 filas por 15 columnas. Los ndices se crearon para permitir que el programador se pueda referir, de forma especfica y directa, a una cualquiera de las casillas de la matriz, tanto para guardar un dato en esa casilla, como para obtener el dato almacenado en ella. En el seudolenguaje, para referirse a una casilla particular de una matriz se debe seguir el siguiente formato: <NOMBRE> [<INDICE-DE-FILA>][<INDICE-DE-COLUMNA>] es decir, se debe escribir el nombre de la matriz seguido por el ndice de fila y por el ndice de columna, ambos entre parntesis cuadrados, de la casilla que se quiere consultar. Para los siguientes ejemplos, suponga que se declara la matriz montos, de la siguiente manera: montos : matriz [6][10] de real La siguiente instruccin asigna o guarda el nmero 10,4 en la casilla de la esquina superior izquierda de esta matriz: montos[0][0]:= 10,4 La siguiente instruccin iterativa guarda 5,5 en cada una de las casillas de la ltima fila de esta matriz: k:=0 MIENTRAS (k<10) HACER montos[5][k]:= 5,5 k:=k+1
FIN-MIENTRAS
2.3.4. Archivos
Muy a menudo necesitamos almacenar cierta cantidad de datos de forma ms o menos permanente. La memoria del ordenador es voltil, y lo que es peor, escaso y caro. De modo que cuando tenemos que guardar nuestros datos durante cierto tiempo tenemos que recurrir a sistemas de almacenamiento ms econmicos, aunque sea a costa de que sean ms lentos. Durante la historia de los ordenadores se han usado varios mtodos distintos para el almacenamiento de datos. Al principio se recurri a cintas de papel perforadas, despus a tarjetas perforadas. A continuacin se pas al soporte magntico, empezando por grandes rollos de cintas magnticas abiertas. Hasta aqu, todos los sistemas de almacenamiento externo eran secuenciales, es decir, no permitan acceder al punto exacto donde se guardaba la informacin sin antes haber partido desde el principio y sin haber ledo toda la informacin, hasta el punto donde se encontraba la que estbamos buscando. Con las cintas magnticas empez lo que con el tiempo sera el acceso aleatorio a los datos. Se poda reservar parte de la cinta para guardar cierta informacin sobre la situacin de los datos, y aadir ciertas marcas que hicieran ms sencillo localizarla. Pero no fue hasta la aparicin de los discos magnticos cuando sta tcnica lleg a su sentido ms amplio. En los discos es ms sencillo acceder a cualquier punto de la superficie en poco tiempo, ya que se accede al punto de lectura y escritura usando dos coordenadas fsicas. Por una parte la cabeza de lectura/escritura se puede mover en el sentido del radio del disco, y por otra el disco gira permanentemente, con lo que cualquier punto del disco pasa por la cabeza en un tiempo relativamente corto. Esto no pasa con las cintas, donde slo hay una coordenada fsica. Con la invencin y proliferacin de los discos se desarrollaron los ficheros de acceso aleatorio, que permiten acceder a cualquier dato almacenado en un fichero en relativamente poco tiempo. Actualmente, los discos duros tienen una enorme capacidad y son muy rpidos, aunque an siguen siendo lentos, en comparacin con las memorias RAM. El caso de los CD es algo intermedio. En realidad son secuenciales en cuanto al modo de guardar los datos, cada disco slo tiene una pista de datos grabada en espiral. Sin embargo, este sistema, combinado con algo de memoria RAM, proporciona un acceso muy prximo al de los discos duros. En cuanto al tipo de acceso, en C y C++ podemos clasificar los archivos segn varias categoras: 1. Dependiendo de la direccin del flujo de datos: De entrada: los datos se leen por el programa desde el archivo. De salida: los datos se escriben por el programa hacia el archivo. De entrada/salida: los datos pueden se escritos o ledos. 2. Dependiendo del tipo de valores permitidos a cada byte: De texto: slo estn permitidos ciertos rangos de valores para cada byte.
Algunos bytes tienen un significado especial, por ejemplo, el valor hexadecimal 0x1A marca el fin de fichero. Si abrimos un archivo en modo texto, no ser posible leer ms all de un byte con ese valor, aunque el fichero sea ms largo. Binarios: estn permitidos todos los valores para cada byte. En estos archivos el final del fichero se detecta de otro modo, dependiendo del soporte y del sistema operativo. La mayora de las veces se hace guardando la longitud del fichero. Cuando queramos almacenar valores enteros, o en coma flotante, o imgenes, etc., deberemos usar este tipo de archivos. 3. Segn el tipo de acceso: Archivos secuenciales: imitan el modo de acceso de los antiguos ficheros secuenciales almacenados en cintas magnticas y Archivos de acceso aleatorio: permiten acceder a cualquier punto de ellos para realizar lecturas y/o escrituras. 4. Segn la longitud de registro: Longitud variable: en realidad, en este tipo de archivos no tiene sentido hablar de longitud de registro, podemos considerar cada byte como un registro. Tambin puede suceder que nuestra aplicacin conozca el tipo y longitud de cada dato almacenado en el archivo, y lea o escriba los bytes necesarios en cada ocasin. Otro caso es cuando se usa una marca para el final de registro, por ejemplo, en ficheros de texto se usa el carcter de retorno de lnea para eso. En estos casos cada registro es de longitud diferente. Longitud constante: en estos archivos los datos se almacenan en forma de registro de tamao contante. En C usaremos estructuras para definir los registros. C dispone de funciones de librera adecuadas para manejar este tipo de ficheros. Mixtos: en ocasiones pueden crearse archivos que combinen los dos tipos de registros, por ejemplo, dBASE usa registros de longitud constante, pero aade un registro especial de cabecera al principio para definir, entre otras cosas, el tamao y el tipo de los registros. Es posible crear archivos combinando cada una de estas categoras, por ejemplo: archivos secuenciales de texto de longitud de registro variable, que son los tpicos archivos de texto. Archivos de acceso aleatorio binarios de longitud de registro constante, normalmente usados en bases de datos. Y tambin cualquier combinacin menos corriente, como archivos secuenciales binarios de longitud de registro constante, etc. En cuanto a cmo se definen estas propiedades, hay dos casos. Si son binarios o de texto o de entrada, salida o entrada/salida, se define al abrir el fichero, mediante la funcin fopen en C o mediante el mtodo open de fstream en C++. La funcin open usa dos parmetros. El primero es el nombre del fichero que contiene el archivo. El segundo es en modo que es una cadena que indica el modo en que se abrir el archivo: lectura o escritura, y el tipo de datos que contiene: de texto o binarios. En C, los ficheros admiten seis modos en cuanto a la direccin del flujo de datos: l r: slo lectura. El fichero debe existir.
l w: se abre para escritura, se crea un fichero nuevo o se sobrescribe si ya existe. l a: aadir, se abre para escritura, el cursor se sita al final del fichero. Si el fichero no existe, se crea. l r+: lectura y escritura. El fichero debe existir. l w+: lectura y escritura, se crea un fichero nuevo o se sobrescribe si ya existe. l a+: aadir, lectura y escritura, el cursor se sita al final del fichero. Si el fichero no existe, se crea. En cuanto a los valores permitidos para los bytes, se puede aadir otro carcter a la cadena de modo: l t: modo texto. Normalmente es el modo por defecto. Se suele omitir. l b: modo binario. En ciertos sistemas operativos no existe esta distincin, y todos los ficheros son binarios. En C++ es algo diferente, el constructor de las clases ifstream, ofstream y fstream admite los parmetros para abrir el fichero directamente, y tambin disponemos del mtodo open, para poder crear el stream sin asociarlo con un fichero concreto y hacer esa asociacin ms tarde.
Tipo FILE:
C define la estructura de datos FILE en el fichero de cabecesa "stdio.h" para el manejo de ficheros. Nosotros siempre usaremos punteros a estas estructuras. La definicin de sta estructura depende del compilador, pero en general mantienen un campo con la posicin actual de lectura/escritura, un buffer para mejorar las prestaciones de acceso al fichero y algunos campos para uso interno.
Funcin fopen:
Sintaxis: FILE *fopen(char *nombre, char *modo); sta funcin sirve para abrir y crear ficheros en disco. El valor de retorno es un puntero a una estructura FILE. Los parmetros de entrada son: 1. nombre: una cadena que contiene un nombre de fichero vlido, esto depende del sistema operativo que estemos usando. El nombre puede incluir el camino completo. 2. modo: especifica en tipo de fichero que se abrir o se crear y el tipo de datos que puede contener, de texto
o binarios: r: slo lectura. El fichero debe existir. w: se abre para escritura, se crea un fichero nuevo o se sobrescribe si ya existe. a: aadir, se abre para escritura, el cursor se sita al final del fichero. Si el fichero no existe, se crea. r+: lectura y escritura. El fichero debe existir. w+: lectura y escritura, se crea un fichero nuevo o se sobrescribe si ya existe. a+: aadir, lectura y escritura, el cursor se sita al final del fichero. Si el fichero no existe, se crea. t: tipo texto, si no se especifica "t" ni "b", se asume por defecto que es "t" b: tipo binario.
Funcin fclose:
Sintaxis: int fclose(FILE *fichero); Es importante cerrar los ficheros abiertos antes de abandonar la aplicacin. Esta funcin sirve para eso. Cerrar un fichero almacena los datos que an estn en el buffer de memoria, y actualiza algunos datos de la cabecera del fichero que mantiene el sistema operativo. Adems permite que otros programas puedan abrir el fichero para su uso. Muy a menudo, los ficheros no pueden ser compartidos por varios programas. Un valor de retorno cero indica que el fichero ha sido correctamente cerrado, si ha habido algn error, el valor de retorno es la constante EOF. El parmetro es un puntero a la estructura FILE del fichero que queremos cerrar.
Funcin fgetc:
Sintaxis: int fgetc(FILE *fichero); Esta funcin lee un carcter desde un fichero. El valor de retorno es el carcter ledo como un unsigned char convertido a int. Si no hay ningn carcter disponible, el valor de retorno es EOF. El parmetro es un puntero a una estructura FILE del fichero del que se har la lectura.
Funcin fputc:
Sintaxis: int fputc(int caracter, FILE *fichero); Esta funcin escribe un carcter a un fichero. El valor de retorno es el carcter escrito, si la operacin fue completada con xito, en caso contrario ser EOF. Los parmetros de entrada son el carcter a escribir, convertido a int y un puntero a una estructura FILE del fichero en el que se har la escritura.
Funcin feof:
Sintaxis: int feof(FILE *fichero); Esta funcin sirve para comprobar si se ha alcanzado el final del fichero. Muy frecuentemente deberemos trabajar con todos los valores almacenados en un archivo de forma secuencial, la forma que suelen tener los bucles para leer todos los datos de un archivo es permanecer leyendo mientras no se detecte el fin de fichero. Esta funcin suele usarse como prueba para verificar si se ha alcanzado o no ese punto. El valor de retorno es distinto de cero slo si no se ha alcanzado el fin de fichero. El parmetro es un puntero a la estructura FILE del fichero que queremos verificar.
Funcin rewind:
Sintaxis: void rewind(FILE *fichero) Es una funcin heredada de los tiempos de las cintas magnticas. Literalmente significa "rebobinar", y hace referencia a que para volver al principio de un archivo almacenado en cinta, haba que rebobinarla. Eso es lo que hace sta funcin, sita el cursor de lectura/escritura al principio del archivo. El parmetro es un puntero a la estructura FILE del fichero que queremos rebobinar. Ejemplos: // ejemplo1.c: Muestra un fichero dos veces. #include <stdio.h> int main() { FILE *fichero; fichero = fopen("ejemplo1.c", "r"); while(!feof(fichero)) fputc(fgetc(fichero), stdout); rewind(fichero); while(!feof(fichero)) fputc(fgetc(fichero), stdout); fclose(fichero); getchar(); return 0; }
Funcin fgets:
Sintaxis: char *fgets(char *cadena, int n, FILE *fichero); Esta funcin est diseada para leer cadenas de caracteres. Leer hasta n-1 caracteres o hasta que lea un retorno de lnea. En este ltimo caso, el carcter de retorno de lnea tambin es ledo. El parmetro n nos permite limitar la lectura para evitar desbordar el espacio disponible en la cadena.
El valor de retorno es un puntero a la cadena leda, si se ley con xito, y es NULL si se detecta el final del fichero o si hay un error. Los parmetros son: la cadena a leer, el nmero de caracteres mximo a leer y un puntero a una estructura FILE del fichero del que se leer.
Funcin fputs:
Sintaxis: int fputs(const char *cadena, FILE *stream); La funcin fputs escribe una cadena en un fichero. No se aade el carcter de retorno de lnea ni el carcter nulo final. El valor de retorno es un nmero no negativo o EOF en caso de error. Los parmetros de entrada son la cadena a escribir y un puntero a la estructura FILE del fichero donde se realizar la escritura.
Funcin fread:
Sintaxis: size_t fread(void *puntero, size_t tamao, size_t nregistros, FILE *fichero); Esta funcin est pensada para trabajar con registros de longitud constante. Es capaz de leer desde un fichero uno o varios registros de la misma longitud y a partir de una direccin de memoria determinada. El usuario es responsable de asegurarse de que hay espacio suficiente para contener la informacin leda. El valor de retorno es el nmero de registros ledos, no el nmero de bytes. Los parmetros son: un puntero a la zona de memoria donde se almacenarn los datos ledos, el tamao de cada registro, el nmero de registros a leer y un puntero a la estructura FILE del fichero del que se har la lectura.
Funcin fwrite:
Sintaxis: size_t fwrite(void nregistros, FILE *fichero);
*puntero, size_t tamao, size_t
Esta funcin tambin est pensada para trabajar con registros de longitud constante y forma pareja con fread. Es capaz de escribir hacia un fichero uno o varios registros de la misma longitud almacenados a partir de una direccin de memoria determinada. El valor de retorno es el nmero de registros escritos, no el nmero de bytes. Los parmetros son: un puntero a la zona de memoria donde se almacenarn los datos ledos, el tamao de cada registro, el nmero de registros a leer y un puntero a la estructura FILE del fichero del que se har la lectura. Ejemplo:
// copia.c: Copia de ficheros // Uso: copia <fichero_origen> <fichero_destino> #include <stdio.h> int main(int argc, char **argv) { FILE *fe, *fs; unsigned char buffer[2048]; // Buffer de 2 Kbytes int bytesLeidos; if(argc != 3) { printf("Usar: copia <fichero_origen> <fichero_destino>\n"); return 1; } // Abrir el fichero de entrada en lectura y binario fe = fopen(argv[1], "rb"); if(!fe) { printf("El fichero %s no existe o no puede ser abierto.\n", argv[1]); return 1; } // Crear o sobrescribir el fichero de salida en binario fs = fopen(argv[2], "wb"); if(!fs) { printf("El fichero %s no puede ser creado.\n", argv[2]); fclose(fe); return 1; } // Bucle de copia: while((bytesLeidos = fread(buffer, 1, 2048, fe))) fwrite(buffer, 1, bytesLeidos, fs); // Cerrar ficheros: fclose(fe); fclose(fs); return 0; }
Funcin fprintf:
Sintaxis: int fprintf(FILE *fichero, const char *formato, ...); La funcin fprintf funciona igual que printf en cuanto a parmetros, pero la salida se dirige a un fichero en lugar de a la pantalla.
Funcin fscanf:
Sintaxis: int fscanf(FILE *fichero, const char *formato, ...); La funcin fscanf funciona igual que scanf en cuanto a parmetros, pero la entrada se toma de un fichero en lugar del teclado.
Funcin fflush:
Sintaxis: int fflush(FILE *fichero); Esta funcin fuerza la salida de los datos acumulados en el buffer de salida del fichero. Para mejorar las prestaciones del manejo de ficheros se utilizan buffers, almacenes temporales de datos en memoria, las operaciones de salida se hacen a travs del buffer, y slo cuando el buffer se llena se realiza la escritura en el disco y se vaca el buffer. En ocasiones nos hace falta vaciar ese buffer de un modo manual, para eso sirve sta funcin. El valor de retorno es cero si la funcin se ejecut con xito, y EOF si hubo algn error. El parmetro de entrada es un puntero a la estructura FILE del fichero del que se quiere vaciar el buffer. Si es NULL se har el vaciado de todos los ficheros abiertos.
Funcin fseek:
Sintaxis: int fseek(FILE origen);
*fichero, long int desplazamiento, int
Esta funcin sirve para situar el cursor del fichero para leer o escribir en el lugar deseado. El valor de retorno es cero si la funcin tuvo xito, y un valor distinto de cero si hubo algn error. Los parmetros de entrada son: un puntero a una estructura FILE del fichero en el que queremos cambiar el cursor de lectura/escritura, el valor del desplazamiento y el punto de origen desde el que se calcular el desplazamiento. El parmetro origen puede tener tres posibles valores: 1. SEEK_SET el desplazamiento se cuenta desde el principio del fichero. El primer byte del fichero tiene un desplazamiento cero. 2. SEEK_CUR el desplazamiento se cuenta desde la posicin actual del cursor. 3. SEEK_END el desplazamiento se cuenta desde el final del fichero.
Funcin ftell:
Sintaxis: long int ftell(FILE *fichero); La funcin ftell sirve para averiguar la posicin actual del cursor de lectura/escritura de un fichero. El valor de retorno ser esa posicin, o -1 si hay algn error. El parmetro de entrada es un puntero a una estructura FILE del fichero del que queremos leer la posicin del cursor de lectura/escritura.
Clase ofstream:
Lo mismo pasa con ofstream, salvo que los valores por defecto de los parmetros son diferentes: ofstream(); ofstream(const char *name, int mode = ios::out, int = filebuf::openprot);
Clase fstream:
fstream(); fstream(const char *name, int mode = ios::in, int = filebuf::openprot);
Mtodo open:
Todas estas clases disponen adems del mtodo "open", para abrir el fichero a lo largo de la ejecucin del programa. void open(const char *name, int mode, int prot=filebuf::openprot);
"name" es el nombre del fichero, mode es el modo en que se abrir, puede ser uno o una combinacin del tipo enumerado open_mode, de la clase "ios": enum open_mode { in, out, ate, app, trunc, nocreate, noreplace, binary }; Cada uno de los valores se pueden combinar usando el operador de bits OR (|), y significan lo siguiente: l in: modo de entrada. l out: modo de salida. l ate: abre el fichero y sita el cursor al final. l app: modo append, parecido al anterior, pero las operaciones de escritura siempre se hacen al final del fichero. l trunc: si se aplica a ficheros de salida, se crear el fichero si no existe previamente, o se truncar con un tamao de 0 bytes, si existe. l nocreate: impide crear un fichero si no existe, en ese caso, la funcin falla. l noreplace: lo ignoro. l binary: abre el fichero en modo binario. Los tres ltimos modos probablemente no son estndar, y es posible que no existan en muchos compiladores.
Mtodo close:
void close();
Operador >>:
Igual que sucede con el stream estndar cout, el operador de flujo de salida >> se puede usar con streams de salida cuando trabajemos con texto.
Operador <<:
Del mismo modo, al igual que sucede con el stream estndar cin, el operador de flujo de entrada << se puede usar con streams de entrada cuando trabajemos con texto.
La tercera forma extrae un nico carcter en la referencia a char proporcionada. La cuarta no nos interesa de momento.
Mtodo clear:
void clear(iostate state=0); Cada vez que se produzca una condicin de error en un stream es necesario eliminarla, ya que en caso contrario ninguna operacin que se realice sobre l tendr xito. Por ejemplo, si llegamos hasta el final de fichero, el stream quedar en estado "eof" hasta que se elimine explcitamente ese estado. Eso se hace mediante el mtodo "clear", sin parmetros dejar el estado en 0, es decir, sin errores.
Los estados posibles se definen en un enumerado: enum io_state { goodbit, eofbit, failbit, badbit }; l goodbit: indica que el estado es correcto. l eofbit: indica que se ha detectado fin de fichero. l failbit: indica que una operacin sobre el stream ha fallado. l badbit: se activa si falla una operacin de escritura de buffers.
Mtodo bad:
int bad(); Devuelve el estado del bit "badbit".
Mtodo fail:
int fail(); Devuelve el estado del bit "failbit".
Mtodo good:
int good(); Devuelve el estado del bit "goodbit". Ejemplo: Veamos el ejemplo anterior de mostrar dos veces un fichero, pero esta vez escrito para C++ usando streams: // ejemplo1.cpp: Muestra un fichero dos veces. #include <iostream> #include <fstream> using namespace std; int main() { ifstream fichero("ejemplo1.cpp"); char c; while(fichero.get(c)) cout.put(c); fichero.clear(); // (1) fichero.seekg(0);
while(fichero.get(c)) cout.put(c); fichero.close(); cin.get(); return 0; } Como vemos en (1), es necesario eliminar el bit de eof, que se ha activado al leer hasta el final del fichero, cuando el ltimo intento de llamar a "get" ha fallado, porque se ha terminado el fichero.
Mtodo is_open:
int is_open(); Devuelve un valor no nulo si el fichero est abierto.
Mtodo flush:
iostream& flush(); Realiza las operaciones de escritura pendientes que an se han realizado slo en el buffer.
Mtodo seekg:
Cambia la posicin del cursor en streams de entrada. iostream& seekg(streampos pos); istream& seekg(streamoff offset, seek_dir dir); La primera forma es para cambiar la posicin de modo absoluto. La segunda para cambios relativos, en la que se indica el salto en el primer parmetro y el punto de partida en el segundo, que puede ser cualquiera de los indicados anteriormente: ios::beg, ios::cur o ios::end.
Mtodo seekp:
Cambia la posicin del cursor en streams de salida. iostream& seekp(streampos pos); iostream& seekp(streamoff offset, seek_dir); Lo mismo que seekg, pero aplicado a stream de salida.
Mtodo tellg:
streampos tellg(); Devuelve la posicin actual del cursor dentro de un stream de entrada.
Mtodo tellp:
streampos tellp(); Devuelve la posicin actual del cursor dentro de un stream de salida.
Mtodo read:
istream& read(char*, int); Lee el nmero de caracteres indicado en el segundo parmetro dentro del buffer suministrado por el primero.
Mtodo gcount:
int gcount(); Devuelve el nmero de caracteres sin formato de la ltima lectura. Las lecturas sin formato son las realizadas mediante las funciones get, getline y read.
Mtodo write:
iostream& write(const char*, int); Escribe el nmero de caracteres indicado en el segundo parmetro desde el buffer suministrado por el primero. Ejemplo:
De nuevo haremos el ejemplo de copiar ficheros, pero esta vez usando streams. // copia.cpp: Copia de ficheros // Uso: copia <fichero_origen> <fichero_destino> #include <iostream> #include <fstream> using namespace std; int main(int argc, char **argv) { ifstream entrada; ofstream salida; char buffer[2048]; // Buffer de 2 Kbytes int bytesLeidos; if(argc != 3) { printf("Usar: copia <fichero_origen> <fichero_destino>\n"); return 1; } // Abrir el fichero de entrada en lectura y binario entrada.open(argv[1]); if(!entrada.good()) { printf("El fichero %s no existe o no puede ser abierto.\n", argv[1]); return 1; } // Crear o sobrescribir el fichero de salida en binario salida.open(argv[2]); if(!salida.good()) { printf("El fichero %s no puede ser creado.\n", argv[2]); entrada.close(); return 1; }
// Bucle de copia: do { entrada.read(buffer, 2048); bytesLeidos = entrada.gcount(); salida.write(buffer, bytesLeidos); } while(bytesLeidos > 0); // Cerrar ficheros: entrada.close(); salida.close(); return 0; }
3 Archivos secuenciales
En estos archivos, la informacin slo puede leerse y escribirse empezando desde el principio del archivo. Los archivos secuenciales tienen algunas caractersticas que hay que tener en cuenta: 1. La escritura de nuevos datos siempre se hace al final del archivo. 2. Para leer una zona concreta del archivo hay que avanzar siempre, si la zona est antes de la zona actual de lectura, ser necesario "rebobinar" el archivo. 3. Los ficheros slo se pueden abrir para lectura o para escritura, nunca de los dos modos a la vez. Esto es en teora, por supuesto, en realidad C no distingue si los archivos que usamos son secuenciales o no, es el tratamiento que hagamos de ellos lo que los clasifica como de uno u otro tipo. Pero hay archivos que se comportan siempre como secuenciales, por ejemplo los ficheros de entrada y salida estndar: stdin, stdout, stderr y stdaux. Tomemos el caso de stdin, que suele ser el teclado. Nuestro programa slo podr abrir ese fichero como de lectura, y slo podr leer los caracteres a medida que estn disponibles, y en el mismo orden en que fueron tecleados. Lo mismo se aplica para stdout y stderr, que es la pantalla, en estos casos slo se pueden usar para escritura, y el orden en que se muestra la informacin es el mismo en que se enva. Un caso especial es stdaux, que suele ser el puerto serie. Tambin es un archivo secuencial, con respecto al modo en que se leen y escriben los datos. Sin embargo se un fichero de entrada y salida. Trabajar con archivos secuenciales tiene algunos inconvenientes. Por ejemplo, imagina que tienes un archivo de este tipo en una cinta magntica. Por las caractersticas fsicas de este soporte, es evidente que slo podemos tener un fichero abierto en cada unidad de cinta. Cada fichero puede ser ledo, y tambin sobrescrito, pero en general, los archivos que haya a continuacin del que escribimos se perdern, o bien sern sobrescritos al crecer el archivo, o quedar un espacio vaco entre el final del archivo y el principio del siguiente. Lo normal cuando se quera actualizar el contenido de un archivo de cinta aadiendo o modificando datos, era abrir el archivo en modo lectura en una unidad de cinta, y crear un nuevo fichero de escritura en una unidad de cinta distinta. Los datos ledos de una cinta se editan o modifican, y se copian en la otra secuencialmente.
Cuando trabajemos con archivos secuenciales en disco haremos lo mismo, pero en ese caso no necesitamos dos unidades de disco, ya que en los discos es posible abrir varios archivos simultneamente. En cuanto a las ventajas, los archivos secuenciales son ms sencillos de manejar, ya que requieren menos funciones, adems son ms rpidos, ya que no permiten moverse a lo largo del archivo, el punto de lectura y escritura est siempre determinado. En ocasiones pueden ser tiles, por ejemplo, cuando slo se quiere almacenar cierta informacin a medida que se recibe, y no interesa analizarla en el momento. Posteriormente, otro programa puede leer esa informacin desde el principio y analizarla. Este es el caso de archivos "log" o "diarios" por ejemplo, los servidores de las pginas WEB pueden generar una lnea de texto cada vez que alguien accede a una de las pginas y las guardan en un fichero secuencial.
controlar la integridad y seguridad de los datos, reconstruir y reestructurar la base de datos cuando sea necesario.
dato esta duplicado y el sistema reconoce esta redundancia, el mismo sistema se encarga de garantizar que todas las copias se mantengan consistentes. Comparticin de datos: Los ficheros pertenecen a las personas o a los departamentos que los utilizan. Pero en los sistemas de bases de datos, la base de datos pertenece a la empresa y puede ser compartida por todos los usuarios que estn autorizados. Mantenimiento de Estndares: Gracias a la integracin, es ms fcil respetar los estndares necesario, tanto los establecidos a nivel de empresa como los nacionales e internacionales. Estos estndares pueden establecerse sobre el formato de los datos para facilitar su intercambio, pueden ser estndares de documentacin, procedimientos de actualizacin y tambin reglas de acceso. Mejora la integridad de datos: La integridad de las bases de datos se refiere a la validez y la consistencia de los datos almacenados. Normalmente, la integridad se expresa mediante restricciones o reglas que no se pueden violar. Estas restricciones se pueden aplicar tanto a los datos, como a sus relaciones, y es Sistema de Gestin de Bases de Datos quien se debe de encargar de mantenerse. Mejora los servicios de copias de seguridad: Muchos sistemas de ficheros dejan que sea el usuario quien proporcione las medidas necesarias para proteger los datos ante fallos en el sistema o en las aplicaciones. Los usuarios tienen que hacer copias de seguridad cada da, y si ocurre algn fallo, utilizar las copias para restaurarlos.