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, escasa y cara. 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, empeando por grandes rollos de cintas magnticas a!iertas. "asta aqu#, todos los sistemas de almacenamiento e$terno eran secuenciales, es decir, no permit#an acceder al punto e$acto donde se guarda!a la informacin sin antes ha!er partido desde el principio y sin ha!er le#do toda la informacin, hasta el punto donde se encontra!a la que esta!amos !uscando. %on las cintas magnticas empe lo que con el tiempo ser#a el acceso aleatorio a los datos. &e pod#a reservar parte de la cinta para guardar cierta informacin so!re la situacin de los datos, y a'adir ciertas marcas que hicieran ms sencillo localiarla. (ero no fu hasta la aparicin de los discos magnticos cuando sta tcnica lleg a su sentido ms amplio. )n 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 f#sicas. (or una parte la ca!ea 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 ca!ea en un tiempo relativamente corto. )sto no pasa con las cintas, donde slo hay una coordenada f#sica. %on 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 a+n siguen siendo lentos, en comparacin con las memorias ,AM. )l caso de los %D es algo intermedio. )n realidad son secuenciales en cuanto al modo de guardar los datos, cada disco slo tiene una pista de datos gra!ada en espiral. &in em!argo, este sistema, com!inado con algo de memoria ,AM, proporciona un acceso muy pr$imo al de los discos duros. )n cuanto al tipo de acceso, en % y %-- podemos clasificar los archivos seg+n varias categor#as. /. Dependiendo de la direccin del flujo de datos. o De entrada. los datos se leen por el programa desde el archivo. o De salida. los datos se escri!en por el programa hacia el archivo. o De entrada*salida. los datos pueden se escritos o le#dos. 0. Dependiendo del tipo de valores permitidos a cada !yte. o De te$to. slo estn permitidos ciertos rangos de valores para cada !yte. Algunos !ytes tienen un significado especial, por ejemplo, el valor he$adecimal 1$/A marca el fin de fichero. &i a!rimos un archivo en modo te$to, no ser posi!le leer ms all de un !yte con ese valor, aunque el fichero sea ms largo. o 2inarios. estn permitidos todos lo valores para cada !yte. )n estos archivos el final del fichero se detecta de otro modo, dependiendo del soporte y del sistema operativo. La mayor#a de las veces se hace guardando la longitud del fichero. %uando queramos almacenar valores enteros, o en coma flotante, o imgenes, etc, de!eremos usar este tipo de archivos. 3. &eg+n el tipo de acceso. o Archivos secuenciales. imitan el modo de acceso de los antiguos ficheros secuenciales almacenados en cintas magnticas y o Archivos de acceso aleatorio. permiten acceder a cualquier punto de ellos para realiar lecturas y*o escrituras. 4. &eg+n la longitud de registro. o Longitud varia!le. en realidad, en este tipo de archivos no tiene sentido ha!lar de longitud de registro, podemos considerar cada !yte como un registro. 5am!in puede suceder que nuestra aplicacin conoca el tipo y longitud de cada dato almacenado en el archivo, y lea o escri!a los !ytes necesarios en cada ocasin. 6tro caso es cuando se usa una marca para el final de registro, por ejemplo, en ficheros de te$to se usa el carcter de retorno de l#nea para eso. )n estos casos cada registro es de longitud diferente. o Longitud constante. en estos archivos los datos se almacenan en forma de registro de tama'o contante. )n % usaremos estructuras para definir los registros. % dispone de funciones de li!rer#a adecuadas para manejar este tipo de ficheros. o Mi$tos. en ocasiones pueden crearse archivos que com!inen los dos tipos de registros, por ejemplo, d2A&) usa registros de longitud constante, pero a'ade un registro especial de ca!ecera al principio para definir, entre otras cosas, el tama'o y el tipo de los registros. )s posi!le crear archivos com!inando cada una de estas categor#as, por ejemplo. archivos secuenciales de te$to de longitud de registro varia!le, que son los t#picos archivos de te$to. Archivos de acceso aleatorio !inarios de longitud de registro constante, normalmente usados en !ases de datos. 7 tam!in cualquier com!inacin menos corriente, como archivos secuenciales !inarios de longitud de registro constante, etc. )n cuanto a cmo se definen estas propiedades, hay dos casos. &i son !inarios o de te$to o de entrada, salida o entrada*salida, se define al a!rir el fichero, mediante la funcin fopen en % o mediante el mtodo open de fstream en %--. La funcin open usa dos parmetros. )l primero es el nom!re del fichero que contiene el archivo. )l segundo es em modo que es una cadena que indica el modo en que se a!rir el archivo. lectura o escritura, y el tipo de datos que contiene. de te$to o !inarios. )n %, los ficheros admiten seis modos en cuanto a la direccin del flujo de datos. r. slo lectura. )l fichero de!e e$istir. 8. se a!re para escritura, se crea un fichero nuevo o se so!rescri!e si ya e$iste. a. a'adir, se a!re para escritura, el cursor se situa al final del fichero. &i el fichero no e$iste, se crea. r-. lectura y escritura. )l fichero de!e e$istir. 8-. lectura y escritura, se crea un fichero nuevo o se so!rescri!e si ya e$iste. a-. a'adir, lectura y escritura, el cursor se situa al final del fichero. &i el fichero no e$iste, se crea. )n cuanto a los valores permitidos para los !ytes, se puede a'adir otro carcter a la cadena de modo. t. modo te$to. 9ormalmente es el modo por defecto. &e suele omitir. !. modo !inario. )n ciertos sistemas operativos no e$iste esta distincin, y todos los ficheros son !inarios. )n %-- es algo diferente, el constructor de las clases ifstream, ofstream y fstream admite los parmetros para a!rir el fichero directamente, y tam!in disponemos del mtodo open, para poder crear el stream sin asociarlo con un fichero concreto y hacer esa asociacin ms tarde. :uente. http.**c.conclase.net*ficheros*inde$.php C++ Escribir Informacin a un Archivo a Travs del Operador de Insercin (<<) %uando utilia el cout es un o!jeto del tipo ofstream ;flujo de salida<. =tiliando la clase ofstream, sus programas pueden realiar la salida a cout ;iostream.h< utiliando el operador de insercin ;>><. )l archivo de enca!eado fstream.h define una clase para el flujo de salida hacia archivos llamado ofstream. =tiliando los o!jetos de la clase ofstream, sus programas pueden realiar la salida a archivos. &inta$is. ofstream identificador?salida;@nom!re?archivoA<B Leer Informacin del Archivo a Travs del Operador de Extraccin () %uando utilia el cin es un o!jeto del tipo ifstream ;flujo de entrada<. =tiliando la clase ifstream, sus programas pueden realiar la entrada a cin ;iostream.h< utiliando el operador de e$traccin ;CC<. )l archivo de enca!eado fstream.h define una clase para el flujo de entrada hacia archivos llamado ifstream. =tiliando los o!jetos de la clase ifstream, sus programas pueden realiar la lectura de archivos. &inta$is. ifstream identificador?entrada;@nom!re?archivoA<B A travs del mtodo getline de un o!jeto ;identificador< del tipo ifstream se puede realiar la lectura de una l#nea completa del archivo especificado. &inta$is. identificador?entrada.getline;varia!le,sieof;varia!le<<B 6tra manera de realiar la lectura de pala!ras o campos de datos de una l#nea del archivo se puede optar por el uso de la siguiente sinta$is. identificador?entrada CCvaria!leB Error de Operacin en Archivos Ayudar que los programas prue!en la e$istencia de errores, puede utiliar el mtodo fail del o!jeto archivo. &i no ocurre un error durante una operacin de archivo, la funcin fail regresar el valor de falso ;1<. &i ocurre un error, sin em!argo, regresar verdadero. &inta$is. Df ;identificador.fail; << E cout>>AMensaje de )rrorAB F !errar un Archivo %uando su programa termina, el sistema operativo cerrar todos los programas que haya a!ierto. %omo regla, sin em!argo, cuando su programa ya no necesite un archivo, de!er cerrarlo. (ara cerrar un archivo, su programa de!er utiliar la funcin close. &inta$is. identificador.close; <B Modos de Apertura de un Archivo en %-- A continuacin se presentan las especificaciones para los tipos de apertura, seg+n el tipo de archivo utiliado. "odo de Apertura #i$nificado ios..app A!rir un nuevo archivo en el modo de adicin, poniendo el apuntador del archivo al final del mismo. ios..in )specifica que el archivo ser a!ierto para meter datos en l. ios..out )specifica que el archivo ser a!ierto para dar salida a datos. &inta$is. ofstream identificador?salida;@nom!re?archivoA,modo?de?apertura<B ifstream identificador?entrada;@nom!re?archivoA,modo?de?apertura<B E%E"&LO# // Programa 1: Almacenar texto en un archivo a travs de un objeto ofstream. #include <fstream.h> #include <conio.h> void main() { ofstream X("curso.txt"); X <<"Aprenda C "<< endl; X <<"!n"enier#a !nformatica" << endl; X <<"Codi"o$ %%&'&"; cout <<"Archivo de (alida Creado"; "etch(); ) // Programa 2: Abrir un archivo para adicionar texto al final del mismo. #include <fstream.h> #include <conio.h> void main() { char nom*re+'&,; ofstream -("curso.txt".ios$$app); cout<<"!n"rese su nom*re$"; cin>>nom*re; - <<"/nAprenda 0uilder"<< endl; - <<"!n"enier#a !nformatica" << endl; - <<"1om*re$"<<nom*re; cout <<"Archivo de (alida Creado"; "etch(); ) // Programa 3: eer un archivo de texto a travs de un objeto ifstream. #include <fstream.h> #include <conio.h> void main() { char linea+'&&,; ifstream 2("curso.txt"); 3hile(42.eof()) { 2."etline(linea.si5eof(linea)); cout << linea << endl; ) cout <<"/n6a 6ectura del Archivo fue Culminada"; "etch(); 2.close(); ) // Programa !: "eterminar si ha ocurrido un error al momento de abrir un archivo. #include <fstream.h> #include <conio.h> void main() { char linea+'&&,; ifstream 7("nuevo.txt"); if (7.fail()) { cout<<"8rror al a*rir el archivo nuevo.txt"; ) else { 3hile(47.eof()) { 7."etline(linea.si5eof(linea)); cout << linea << endl; ) cout <<"/n6a 6ectura del Archivo fue Culminada"; ) "etch(); 7.close(); ) // Programa #: $ncluir datos de una clase en archivos de texto. #include "iostream.h" #include "stdio.h" #include "conio.h" class persona { pu*lic$ persona ( ){codi"o9&;) void incluir( ); void ultimo:codi"o( ); ;persona ( ){ ) private$ char nom+'<,; int codi"o.edad; ); void persona$$incluir() { =!68 >fptr'9fopen("estudiantes.txt"."a"); codi"o; "otox?(@.A);cout<<"1om*re $ "; cin>>nom; "otox?(@.'&);cout<<"8dad $ "; cin>>edad; fprintf(fptr'."BCd B'<s BCd/n".codi"o.nom.edad); fclose(fptr'); ) void persona$$ultimo:codi"o() { =!68 >fptrD9fopen("estudiantes.txt"."r"); if (fptrD991E66) { clrscr( ); "otox?(F.'D); cout<<">>> 1o existe el Archivo.fue creado el archivo 8studiantes.GXG >>>"; fptrD9fopen("estudiantes.txt"."a"); "otox?(D&.'%);cout<<" >> Hresione una Gecla para Continuar >> "; "etch(); ) else 3hile (4feof(fptrD)) fscanf(fptrD."BdBsBd".Icodi"o.Inom.Iedad); fclose(fptrD); ) void main( ) { int resp; persona x; x.ultimo:codi"o(); do { clrscr(); "otox?(%'.%);cprintf(" AJK8JAK K8J!(GKL( "); "otox?(%'.C);cprintf(" >>>>>>>>>>>>>>>>> "); x.incluir(); "otox?(D&.DD);cout<<">>> Mesea a"re"ar mas datos ((!9'N1L9&) >>>$"; cin>>resp; ) 3hile(resp); ) // Programa %: $ncluir datos de una clase en archivos binarios #include "iostream.h" #include "stdio.h" #include "conio.h" class persona { pu*lic$ persona ( ){p.codi"o9&;) void incluir( ); void ultimo:codi"o( ); ;persona ( ){ ) private$ struct datos { char nom+'<,; int codi"o.edad; )p; ); void persona$$incluir() { =!68 >fptr'9fopen("alumnos.dat"."a*"); p.codi"o; "otox?(@.A);cout<<"1om*re $ "; cin>>p.nom; "otox?(@.'&);cout<<"8dad $ "; cin>>p.edad; f3rite(Ip.si5eof(struct datos).'.fptr'); fclose(fptr'); ) void persona$$ultimo:codi"o() { =!68 >fptrD9fopen("alumnos.dat"."r*"); if (fptrD991E66) { clrscr( ); "otox?(F.'D); cout<<" >>> 1o existe el Archivo.fue creado el archivo Alumnos.MAG >>> "; fptrD9fopen("alumnos.dat"."a*"); "otox?(D&.'%);cout<<" >> Hresione una Gecla para Continuar >> "; "etch(); ) else { 3hile (4feof(fptrD)) fread(Ip.si5eof(struct datos).'.fptrD); cout<<"8l ultimo codi"o asi"nado para los alumnos fue el numero$"<<p.codi"o; "etch(); ) fclose(fptrD); ) void main( ) { int resp; persona x; x.ultimo:codi"o(); do { clrscr(); "otox?(%'.%);cprintf(" AJK8JAK K8J!(GKL( "); "otox?(%'.C);cprintf(" >>>>>>>>>>>>>>>>> "); x.incluir(); "otox?(D&.DD);cout<<">>> Mesea a"re"ar mas datos ((!9'N1L9&) >>>$"; cin>>resp; ) 3hile(resp); )
Tutorial de Emacs. Vea al final las condiciones de copiado. Generalmente los comandos de Emacs involucran la tecla CONTROL (algunas veces llamada CTRL O CTL) o la tecla meta (algunas veces llamada EDIT o ALT). En lugar de escribir completamente esto en cada ocasión, usaremos las siguientes abreviaturas. C-<car> significa mantener presionada la tecla CONTROL mientras teclea el carácter <car>. Por lo tanto C-f será: Mantenga presionada la tecla CONTROL y teclee f. M-<car> significa mantener presionada la tecla META o EDIT o ALT mientras teclea <car>. Si no hay teclas META, EDIT o ALT, en su lugar presione y libere la tecla ESC y luego teclee <car>. Escribimos <ESC> para referirnos a la tecla ESC. Nota importante: para terminar la sesión de Emacs teclee C-x C-c (dos caracteres). Para cancelar un comando parcialmente introducido, teclee C-g. Los caracteres «>>» en el margen izquierdo indican instrucciones para que usted trate de usar un comando. Por e