archivos- fundamentos

Upload: dakota

Post on 07-Jul-2018

222 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/18/2019 archivos- fundamentos

    1/48

    Ing Yamil Armando Cerquera [email protected]

    ARCHIVOS EN CIng Yamil Armando Cerquera Rojas – [email protected]

    Especialista en Sistemas Universidad acional!ocente Universidad Surcolom"ianaeiva # $uila

    CONTENIDO

    %&u' es un arc(ivo).......................................................................................*!i+erencias con el manejo de pantalla y teclado,.............................................*

    -uncin -I/E,..........................................................................................*Apertura de un arc(ivo, +open01.......................................................................2

    Compro"ar si un arc(ivo est3 a"ierto..........................................................4Cierre de un arc(ivo, +close01...........................................................................56peraciones "3sicas con arc(ivos.....................................................................7Arc(ivos de te8to...........................................................................................9

    Creacin de un arc(ivo,...............................................................................9/as +unciones +print+01 y +scan+01,..................................................................:

    Ejemplo, Utili;acin de la +uncin +print+......................................................<Compro"ar +in de arc(ivo – +eo+.................................................................<Ejemplo, Utili;acin de la +uncin +scan+,...................................................=>

    /as +unciones +gets01? +puts01? getc01 +getc01? putc01 +putc01.......................==Ejemplo, Uso de la +uncin putc...............................................................=*Ejemplo, Uso de la +uncin +getc..............................................................=*/ectura de una cadena de caracteres con la +uncin +gets,...........................=2

    Escritura de una cadena de caracteres con la +uncin +puts..........................=2Ejemplo, 6CI6 A, Uso de +puts y +gets..................................................=2Ejemplo, 6CI6 , Uso de +puts y +gets..................................................=5Ejemplo, Uso de la +uncin gets? +print+ y +scan+.........................................=5Ejemplo, Uso de la +uncin getc y putc......................................................=7Ejemplo, Almacenamiento de estructuras en arc(ivos de tipo te8to con +print+............................................................................................................=9

    Arc(ivos inarios..........................................................................................=:Escritura,.................................................................................................=:

    -Brite...................................................................................................=:/ectura,...................................................................................................*>

    -read....................................................................................................*>Estructuras guardadas en arc(ivos "inarios,..................................................*=Acceso directo a registros en arc(ivos "inarios..............................................*4+see y +tell..............................................................................................*4

    +see....................................................................................................*4+tell......................................................................................................*5

    Arc(ivos con Derarqua de clases..................................................................2>Creacin del o"jeto.................................................................................2=

    Universidad Surcolom"iana   1de48

  • 8/18/2019 archivos- fundamentos

    2/48

    Ing Yamil Armando Cerquera [email protected]

    Apertura del arc(ivo...............................................................................2=Cierre del arc(ivo...................................................................................2*Fanipulacin del arc(ivo.........................................................................226peradores de lectura G escritura..............................................................22=. 6perador de insercin, HH...................................................................22*. 6perador de e8traccin, .................................................................25F'todos de lectura G escritura..................................................................27

    Universidad Surcolom"iana   2de48

  • 8/18/2019 archivos- fundamentos

    3/48

    Ing Yamil Armando Cerquera [email protected]

    Listado de Eem!los

    Ejemplo =, Utili;acin de la +uncin +print+.............................................=*Ejemplo *, Utili;acin de la +uncin +scan+,............................................=4

    Ejemplo 2, Uso de la +uncin putc........................................................=5Ejemplo 4, Uso de la +uncin +getc........................................................=7Ejemplo 5, Uso de +puts y +gets sin control de errores al a"rir y cerrar.......=9Ejemplo 7, Uso de +puts y +gets con control de errores al a"rir y cerrar......=9Ejemplo 9, Uso de +puts y +gets...........................................................=:Ejemplo :, Uso de la +uncin gets? +print+ y +scan+...................................=:Ejemplo , Almacenamiento de estructuras en arc(ivos de tipo te8to

    (aciendo uso de la +uncin +print+....................................................*>Ejemplo ==, Uso de la -uncin +Brite....................................................**Ejemplo =*, Uso d ela +uncin +read.....................................................*2Ejemplo =2, Almacenamiento de estructuras en arc(ivos de "inarios.........*4Ejemplo =5, Almacenamiento de estructuras en arc(ivos de "inarios.........*5Ejemplo =7, Uso de ++lus(? +Brite..........................................................*7Ejemplo =9, Uso de +read....................................................................*7Ejemplo =:, Uso de la +uncin +see.....................................................*:Ejemplo =

  • 8/18/2019 archivos- fundamentos

    4/48

    Ing Yamil Armando Cerquera [email protected]

    Jeneralidades,

    A menudo se necesita almacenar cierta cantidad de datos de +ormapermanente. /a memoria del ordenador KRAFL es vol3til? y lo peor? escasa ycara. !e modo que cuando se necesita guardar datos durante cierto tiempose tiene que recurrir a sistemas de almacenamiento m3s econmicos?aunque sea a costa de que sean m3s lentos.

    !urante la (istoria de los ordenadores se (an usado varios m'todos distintospara el almacenamiento permanente de datos. Al principio se recurri acintas de papel per+oradas? despu's a tarjetas per+oradas. A continuacin sepas al soporte magn'tico? empe;ando por grandes rollos de cintasmagn'ticas a"iertas.

    $asta aqu? todos los sistemas de almacenamiento e8terno eransecuenciales? es decir? no permitan acceder al punto e8acto donde seguarda"a la in+ormacin sin antes (a"er partido desde el principio y sin(a"er ledo toda la in+ormacin? (asta el punto donde se encontra"a la quese esta"a "uscando.

    Con las cintas magn'ticas empe; lo que con el tiempo sera el accesoaleatorio a los datos. Se poda reservar parte de la cinta para guardar ciertain+ormacin so"re la situacin de los datos? y aMadir ciertas marcas que(icieran m3s sencillo locali;arla.

    ero no +ue (asta la aparicin de los discos magn'ticos cuando 'sta t'cnicalleg a su sentido m3s amplio. En los discos es m3s sencillo acceder acualquier punto de la super+icie en poco tiempo? ya que se accede al puntode lectura y escritura usando dos coordenadas +sicas. or una parte laca"e;a de lecturaGescritura se puede mover en el sentido del radio del disco?y por otra el disco gira permanentemente? con lo que cualquier punto deldisco pasa por la ca"e;a en un tiempo relativamente corto. Esto no pasa conlas cintas? donde slo (ay una coordenada +sica.

    Con la invencin y proli+eracin de los discos se desarrollaron los arc(ivos deacceso aleatorio? que permiten acceder a cualquier dato almacenado en unarc(ivo en relativamente poco tiempo.

    Actualmente? los discos duros tienen una enorme capacidad y son muyr3pidos? aunque aNn siguen siendo lentos? en comparacin con la memoriaRAF del C. El caso de los C! es algo intermedio. En realidad son

    Universidad Surcolom"iana   4de48

  • 8/18/2019 archivos- fundamentos

    5/48

    Ing Yamil Armando Cerquera [email protected]

    secuenciales en cuanto al modo de guardar los datos? cada disco slo tieneuna pista de datos gra"ada en espiral. Sin em"argo? este sistema?com"inado con algo de memoria RAF? proporciona un acceso muy pr8imoal de los discos duros.

    %&u' es un arc(ivo)Un arc(ivo es un dispositivo de entrada#salida cuyo +in Nltimo es guardarin+ormacin o permitir la recuperacin de in+ormacin guardada previamente.

    /os arc(ivos se almacenan en dispositivos de almacenamiento masivo comoel disco duro? disette? C!#!O! R6F#RP? Femoria +las(? etc.

    El manejo de los sistemas de almacenamiento de los arc(ivos es gestionadopor el sistema operativo.

    Una operacin de lectura o de escritura de un arc(ivo es parecida a unaoperacin de lectura o escritura de datos desde el teclado

    6peraciones con arc(ivos,

    • Apertura de arc(ivos, +open01• Cierre de arc(ivos, +close01• /ectura de datos de arc(ivos, +scan+01• Escritura de datos en arc(ivos, +print+01

    Es importante indicar que los arc(ivos arc(ivos K-I/ESL no son Nnicamentelos arc(ivos que se guardan en el disco duro o en medios de almacenamientomasivo? en lenguaje C todos los dispositivos del computador se tratan comoarc(ivos, la impresora? el teclado? la pantalla? etc.

    Un arc(ivo se identi+ica por su nom"re? el cual generalmente est3 compuestopor,

    # at(, indica la ruta para encontrar el arc(ivo incluyendo la unidad dealmacenamiento donde se (alla.

    # om"re, es el nom"re que identi+ica los datos guardados en el mediode almacenamiento masivo.

    # E8tensin, son tres caracteres que sirven para identi+icar el tipo dearc(ivo y "3sicamente se relaciona con el programa con la cual se creael arc(ivo.

    Eem!lo, QC,programacionyamil.cQ

    Universidad Surcolom"iana   5de48

  • 8/18/2019 archivos- fundamentos

    6/48

  • 8/18/2019 archivos- fundamentos

    7/48

    Ing Yamil Armando Cerquera [email protected]

    o /ongitud varia"le, en realidad? en este tipo de arc(ivos no tienesentido (a"lar de longitud de registro? se puede considerar cada"yte como un registro. Tam"i'n puede suceder que la aplicacincono;ca el tipo y longitud de cada dato almacenado en el

    arc(ivo? y lea o escri"a los "ytes necesarios en cada ocasin.6tro caso es cuando se usa una marca para el +inal de registro?por ejemplo? en arc(ivos de te8to se usa el car3cter de retornode lnea para eso. En estos casos cada registro es de longituddi+erente.

    o /ongitud constante, en estos arc(ivos los datos se almacenan en+orma de registro de tamaMo constante. En C se usan estructuraspara de+inir los registros. C dispone de +unciones de li"reraadecuadas para manejar este tipo de arc(ivos.

    o Fi8tos, en ocasiones pueden crearse arc(ivos que com"inen losdos tipos de registros? por ejemplo? dASE usa registros delongitud constante? pero aMade un registro especial de ca"eceraal principio para de+inir? entre otras cosas? el tamaMo y el tipo delos registros.

    Es posi"le crear arc(ivos com"inando cada una de estas categoras? porejemplo, arc(ivos secuenciales de te8to de longitud de registro varia"le? queson los tpicos arc(ivos de te8to. Arc(ivos de acceso aleatorio "inarios delongitud de registro constante? normalmente usados en "ases de datos. Ytam"i'n cualquier com"inacin menos corriente? como arc(ivos secuenciales"inarios de longitud de registro constante? etc.

    En cuanto a cmo se de+inen estas propiedades? (ay dos casos. Si son"inarios o de te8to o de entrada? salida o entradaGsalida? se de+ine al a"rir elarc(ivo? mediante la +uncin fopen  en C o mediante el m'todo open  de+stream en C.

    En C es algo di+erente? el constructor de las clases i+stream? o+stream y+stream admite los par3metros para a"rir el arc(ivo directamente? y tam"i'ndisponemos del m'todo open? para poder crear el stream sin asociarlo conun arc(ivo concreto y (acer esa asociacin m3s tarde.

    !i+erencias con el manejo de pantalla y teclado,

    Es necesario esta"lecer un 3rea de "u++er. Esta 3rea almacena la in+ormacinmientras se est3n trans+iriendo datos desde o (acia el arc(ivo.

    Universidad Surcolom"iana   7de48

  • 8/18/2019 archivos- fundamentos

    8/48

    Ing Yamil Armando Cerquera [email protected]

    #u$ci%$ #ILE&

    C de+ine la estructura de datos -I/E en el arc(ivo de ca"ecera Qstdio.(Q parael manejo de arc(ivos. Se de"e usar siempre punteros a estas estructuras.

    /a de+inicin de 'sta estructura depende del compilador? pero en generalmantienen un campo con la posicin actual de lecturaGescritura? un "u++erpara mejorar las prestaciones de acceso al arc(ivo y algunos campos parauso interno.

    ara apuntar al 3rea de "u++er se utili;a la siguiente declaracin,

    -I/E puntVarc(ivoW

    !onde,

    • -I/E es un tipo especial de estructura que esta"lece el 3rea del"u++er. Contiene toda la in+ormacin que necesitan el resto de+unciones que tra"ajan con arc(ivos? como el modo del arc(ivo? los"u++ers del arc(ivo? errores... 0-uncin de la li"rera stdio.(1.

    • puntVarc(ivo es una varia"le de tipo puntero que apunta alcomien;o del 3rea del "u++er.

    El !u$tero #ILE '

    Todas las +unciones de estradaGsalida est3ndar usan este puntero paraconseguir in+ormacin so"re el +ic(ero a"ierto. Este puntero no apunta alarc(ivo sino a una estructura que contiene in+ormacin so"re 'l.

    Esta estructura incluye entre otras cosas in+ormacin so"re el nom"re delarc(ivo? la direccin de la ;ona de memoria donde se almacena el +ic(ero?tamaMo del "u++er.

    Como dato curioso se adjunta la de+inicin de la estructura -I/E de+inida enel +ic(ero stdio.h,

    typede+ structX int VcntW  c(ar VptrW  c(ar V"aseW  int V"u+si;W  int V+lagW

    Universidad Surcolom"iana   8de48

  • 8/18/2019 archivos- fundamentos

    9/48

    Ing Yamil Armando Cerquera [email protected]

      int V+ileW  c(ar VnameVtoVremoveW  int V+illsi;eW -I/EW

    Typede+ structX int eda W  -loat altW  C(ar nomZ=>[ W yamil W

    Yamil 88?yy W

    Apertura de un arc(ivo, +open01

    Esta +uncin sirve para a"rir y crear arc(ivos en disco. El valor de retorno esun puntero a una estructura -I/E.Esta operacin se de"e reali;ar antes de cualquier operacin con un arc(ivo.

    • Una ve; a"ierto el arc(ivo? y (asta que 'ste se cierre? se puedenreali;ar tantas operaciones como se deseen sin necesidad de volver aa"rirlo.

    El o"jetivo de a"rir un arc(ivo es,

    • Asociar el nom"re del arc(ivo K+sicoL con el 3rea del "u++er.• Especi+icar el uso que se le va a dar al arc(ivo 0lectura? escritura?

    lectura#escritura? en modo te8to? "inario ...1

    /a +uncin open usa dos par3metros. El primero es el nom"re del arc(ivoque contiene el arc(ivo. El segundo es el modo? una cadena que indica elmodo en que se a"rir3 el arc(ivo, lectura o escritura? y el tipo de datos quecontiene, de te8to o "inarios.

    rototipo de la +uncin,

    -I/E +open 0c(ar nombre_completo_archivo? c(ar modo1W

    • nombre_completo_archivo 0cadena de caracteres1, es el nom"re delarc(ivo +sico so"re el que se desea tra"ajar.

    Universidad Surcolom"iana   9de48

  • 8/18/2019 archivos- fundamentos

    10/48

    Ing Yamil Armando Cerquera [email protected]

    – Incluyendo el camino completo y la unidad en caso de que +ueranecesario.

    # El valor de retorno de +open01, \8ito, El puntero al comien;o del 3rea del "u++er.

    Error, devuelve U// si no se pudiera a"rir el arc(ivo.• modo 0cadena de caracteres1, indica el uso que tendr3 el arc(ivo o

    arc(ivo

    Apertura de un arc(ivo, Fodo

    r A"re un arc(ivo e8istente para lectura.

    B Crea un arc(ivo nuevo 0o "orra su contenido si e8iste1 y lo a"re paraescritura.

    a

    A"re un arc(ivo 0si no e8iste lo crea1 para escritura. El puntero se sitNa

    al +inal del arc(ivo? de +orma que se puedan aMadir datos sin "orrar lose8istentes.

    En cuanto a los valores permitidos para los "ytes? se puede aMadirmodi+icadores a la cadena de modo tal como sigue,

    • t, modo te8to. ormalmente es el modo por de+ecto. Se suele omitir.• ", modo "inario.

    En ciertos sistemas operativos no e8iste esta distincin? y todos los arc(ivos

    son "inarios.Ejemplos de com"inaciones,

    • r" # A"re el arc(ivo en modo "inario para lectura y escritura.• B # Crea 0o lo "orra si e8iste1 un arc(ivo para lectura y escritura.• rt # A"re un arc(ivo e8istente en modo te8to para lectura.

    En resumen en el lenguaje de programacin C? los arc(ivos admiten seismodos en cuanto a la direccin del +lujo de datos,

    • r, slo lectura. El arc(ivo de"e e8istir.• B, se a"re para escritura? se crea un arc(ivo nuevo o se so"rescri"e si

    ya e8iste.• a, aMadir? se a"re para escritura? el cursor se sitNa al +inal del arc(ivo.

    Si el arc(ivo no e8iste? se crea.• r, lectura y escritura. El arc(ivo de"e e8istir.

    Universidad Surcolom"iana   10de48

  • 8/18/2019 archivos- fundamentos

    11/48

    Ing Yamil Armando Cerquera [email protected]

    • B, lectura y escritura? se crea un arc(ivo nuevo o se so"rescri"e si yae8iste.

    • a, aMadir? lectura y escritura? el cursor se sitNa al +inal del arc(ivo. Siel arc(ivo no e8iste? se crea.

    Com!ro(ar si u$ arc)i*o est+ a(ierto

    Algo "ien importante despu's de a"rir un arc(ivo es compro"ar si realmenteest3 a"ierto. El sistema no es in+ali"le y pueden producirse errores, elarc(ivo puede no e8istir? estar daMado o no tener permisos de lectura.

    Si se intenta reali;ar operaciones so"re un puntero tipo -I/E cuando no se (aconseguido a"rir el arc(ivo puede (a"er pro"lemas. or eso es importantecompro"ar si se (a a"ierto con '8ito.

    Si el arc(ivo no se (a a"ierto el puntero  pfich 0puntero a -I/E1 tendr3 elvalor U//? si se (a a"ierto con '8ito tendr3 un valor distinto de U//. or lotanto para compro"ar si (a (a"ido errores se +ija en el valor del puntero,

    -I/E p+ic(Wp+ic(]+open0Kc,yamil.t8tL1 Wi+ 0p+ic(]]U//1X print+0 Qo se puede a"rir el arc(ivo.nQ 1W  e8it0=1W 

    Si p+ic( es igual a U//? signi+ica que no se (a podido a"rir por algNn error./o m3s conveniente es salir del programa. ara salir se utili;a la +uncine8it0=1? el = indica al sistema operativo que se (an producido errores.

    Cierre de un arc(ivo, +close01

    Es importante cerrar los arc(ivos a"iertos antes de +inali;ar la aplicacin.Esta +uncin sirve para eso. Cerrar un arc(ivo almacena los datos que aNnest3n en el "u++er de memoria? y actuali;a algunos datos de la ca"ecera del

    arc(ivo que mantiene el sistema operativo. Adem3s permite que otrosprogramas puedan a"rir el arc(ivo para su uso. A menudo? los arc(ivos nopueden ser compartidos por varios programas.

    Un valor de retorno cero indica que el arc(ivo (a sido correctamente cerrado?si (a (a"ido algNn error? el valor de retorno es la constante E6-. El

    Universidad Surcolom"iana   11de48

  • 8/18/2019 archivos- fundamentos

    12/48

    Ing Yamil Armando Cerquera [email protected]

    par3metro es un puntero a la estructura -I/E del arc(ivo que se quierecerrar.

    – Su o"jetivo es li"erar el espacio del 3rea del "u++er.– Se escri"en a disco todos los datos que aNn queden en el "u++er? se KdesconectaL el arc(ivo del programa y se li"era el puntero al arc(ivo.– Es o"ligatorio cerrar un arc(ivo cuando se (aya terminado con su uso

    dentro del programa.– Siempre que se quiera cam"iar la +orma de acceso al arc(ivo? tam"i'n

    ser3 necesario cerrarlo y volverlo a a"rir especi+icando el nuevo tipo deacceso para el manejo del arc(ivo. Un arc(ivo no puede a"rirse m3s de una ve; sin antes (a"erlo

    cerrado.

    rototipo de la +uncin,int +close0-I/E  puntero_al_archivo1W

     puntero_al_archivo: es el puntero a arc(ivo devuelto por la +uncin+open01 al a"rir el arc(ivo que a(ora se desea cerrar.

    El valor devuelto por la +uncin es, >, si el arc(ivo se cerr con '8ito. =, si ocurri algNn tipo de error al cerrar el arc(ivo

    Independientemente del valor de retorno? el arc(ivo se cierra.Un error tpico es que el disco se (a llenado y no se (a podido

    vaciar el "u++er con la consiguiente p'rdida de datos.i+ 0+close0p+ic(1 ^] >1

      print+0 Qro"lemas al cerrar el arc(ivo nQ 1W

    6peraciones "3sicas con arc(ivos_include Hstdio.(void main0void1X -I/E p+ic(W Declaración de un puntero a archivop+ic( ] +open0Ka,datos.datL?LBL1W Apertura en modo escritura 0B1 del arc(ivo

     Kdatos.datL i+ 0p+ic( ]] U//1 Compro"acin de que la apertura (a sido

    incorrectaX print+0Kn Error al a"rir el arc(ivoL1W  e8it0=1W Se utili;a el arc(ivo para escritura Al aca"ar

    de usar el arc(ivoi+ 0+close0p+ic(1 ^] >1 Cierre del arc(ivo y compro"acin de si se

    (a reali;ado correctamenteX print+0Ln Error al cerrar el arc(ivo K1W

    Universidad Surcolom"iana   12de48

  • 8/18/2019 archivos- fundamentos

    13/48

    Ing Yamil Armando Cerquera [email protected]

      e8it0=1W

    Tipos de arc(ivo,

    Te8too Arc(ivos ASCII planos? o"tenidos y manejados desde programa

    utili;ando cadenas de caracteres.o Se pueden ver con un editor de te8to.

    inarioo Arc(ivos con los datos guardados como copia e8acta de la memoria

    del ordenador 0"inario1.o Slo comprensi"le desde un programa que KsepaL qu' tipos deo datos contiene el arc(ivo y de qu' +orma est3n guardados.o Si se visuali;an con un editor de te8to no son comprensi"les.o /os arc(ivos "inarios y los programa que utili;an arc(ivos "inarios

    no son +3cilmente porta"les a otros ordenadores y otroscompiladores 0el tamaMo de las varia"les puede variar1.

    Arc(ivos de te8to

    /os archivos de texto  son legi"les y +3ciles de portar? pero ocupan m3sespacio para almacenar la in+ormacin. /os archivos binarios  no son

    legi"les con un editor de te8to y no son porta"les de un ordenador a otro?pero ocupan menos espacio.

    Ejemplo, Cuatro dgitos num'ricos *572? que se desee guardar.

    Como arc(ivo te8to ocupa 4 "ytes as,

    * 5 7 2>>==>>=> >>==>=>= >>==>==> >>==>>==

    Como arc(ivo "inario ocupara * "ytes en programacin de =7 "it`s as,*572

    >>>>=>=> >>>>>>==

    Universidad Surcolom"iana   13de48

  • 8/18/2019 archivos- fundamentos

    14/48

    Ing Yamil Armando Cerquera [email protected]

    Creacin de un arc(ivo,

    – Un arc(ivo secuencial de"e ser creado antes de ser procesado.– -ormas de crear un arc(ivo,

    o !irectamente, Fediante el uso de un editor de te8to 0arc(ivos dete8to1.

    o Indirectamente, Fediante un programa que reci"a in+ormacin? laprocese y la guarde en un arc(ivo 0te8to o "inario1.

    /a lectura y escritura de arc(ivos vara segNn el tipo de arc(ivos,

    – Te8to, +print+? +scan+? getc? putc? +gets? +puts– inarios, +Brite? +read? +see

    Son los arc(ivos que contienen caracteres ASCII.

    /os arc(ivos pueden guardar cadenas de caracteres,– Es posi"le utili;ar las +unciones de "i"lioteca utili;adas para escri"ir yGo

    leer cadenas.– /a di+erencia est3 en que a(ora cuando se utilicen estas +unciones (ay

    que incluir el puntero al "u++er del arc(ivoo putc0car3cter?puntero1o getc0puntero1o +puts0cadena?puntero1o +gets0cadena?numero de caracteres?puntero1o +print+0puntero?cadena de control?varia"les1o +scan+0puntero? cadena de control?varia"les1

    /as +unciones +print+01 y +scan+01,

    /as propias +unciones se encargan de reali;ar las conversiones de +ormatoque son necesarias para poder trans+ormar los valores "inarios usadosinternamente en el ordenador a cadenas de caracteres usadas en losarc(ivos de te8to.

    ,!ri$t,-&

    El +uncionamiento es id'ntico al de print+01 salvo que a(ora esnecesario indicar en qu' arc(ivo (a de escri"ir.

    Oalor retornado,o \8ito, devuelve el nNmero de "ytes que (a escritoo -racaso, devuelve E6-

    Universidad Surcolom"iana   14de48

  • 8/18/2019 archivos- fundamentos

    15/48

    Ing Yamil Armando Cerquera [email protected]

    Sinta8is,

    int +print+0-I/E +ic(ero? const c(ar +ormato? ...1W/a +uncin +print+ +unciona igual que print+ en cuanto a par3metros? pero lasalida se dirige a un arc(ivo en lugar de a la pantalla.

    • ,sca$,-&

    El +uncionamiento es id'ntico al de scan+01 salvo que a(ora esnecesario indicar de qu' arc(ivo (a de leer.

    Oalor retornado 0cuando slo se lee un valor1,o \8ito, devuelve el valor = si (a ledo correctamenteo -racaso, devuelve > si (a ocurrido un error en la lectura por una

    mala especi+icacin de +ormato.o E6-, si no se (a ledo nada porque se (a llegado al +inal del

    arc(ivo.

    Sinta8is,

    int +scan+0-I/E +ic(ero? const c(ar +ormato? ...1W

    /a +uncin +scan+ +unciona igual que scan+ en cuanto a par3metros? pero la

    entrada se toma de un arc(ivo en lugar del teclado.

    Ejemplo =, Utili;acin de la +uncin +print+.

    En este ejemplo cada ve; que se ejecute el programa se crea de nuevo elarc(ivo con el nom"re Kyamil.t8tL so"re la ra; del disco duro etiquetadocomo C. Si ya e8isten datos previamente guardados? es decir el arc(ivo yae8iste? los datos almacenados se perder3n y se crear3 uno nuevo con los tresdatos que se piden al usuario ingrese por teclado.

    _include Hstdio.(

    _include Hconio.(_include Hstdli".(void main01X int n]2? G Nmero de datos a gra"arG  i]=W

    -I/E p+ic(W G untero al arc(ivo G  int datoW  clrscr01W

    Universidad Surcolom"iana   15de48

  • 8/18/2019 archivos- fundamentos

    16/48

    Ing Yamil Armando Cerquera [email protected]

      p+ic( ] +open0Qc,yamil.t8tQ? QBQ1W  i+ 0p+ic( ]] U//1  X print+0QError, o se puede a"rir el arc(ivo Qyamil.t8tQnQ1W  getc(01W  e8it0=1W

        B(ile 0iH]21 G /ee tres valores num'ricos de tipo enteroG  X print+0Q!igite un dato Q1W

      scan+0QbdQ?dato1W  n ] +print+0p+ic(?Qb7dQ?dato1W G Juarda el dato ledo con el +ormatoG

        i+0 +close0p+ic(1 ^] >1  X print+0QError al cerrar el arc(ivonQ1W getc(01W e8it0=1W    getc(01W

    ara el anterior ejemplo? en caso de no e8istir el arc(ivo yamil.t8t so"re lara; KrootL del disco duro en su particin c? no (a"ra pro"lema porque locreara y adicionara los tres datos enteros ledos por teclado. Si los datosledos corresponden al =*5? =*4? =*2 el arc(ivo al a"rirlo mostrara los datosas. tese que los espacios corresponden al +ormato dado de b7d.

      =*5 =*4 =*2

    Com!ro(ar ,i$ de arc)i*o / ,eo, 

    Cuando se tra"aja con el "ucle B(ile? para leer datos desde un arc(ivo? lalectura se reali;a (asta que se encuentre el +inal del arc(ivo. ara detectar el+inal del arc(ivo se pueden tra"ajar de dos +ormas,

    • con la +uncin feof() • compro"ando si el valor de una varia"le letra de tipo c(ar es EO#.

    En el ejemplo (a usado la +uncin +eo+. Esta +uncin es de la +orma,

    int +eo+0-I/E arc(ivo1W

    Esta +uncin comprue"a si se (a llegado al +inal del archivo en cuyo casodevuelve un valor distinto de >. Si no se (a llegado al +inal del arc(ivodevuelve un cero. or eso se usa del siguiente modo,

    B(ile 0 +eo+0arc(ivo1]]> 1 B(ile 0 ̂+eo+0arc(ivo1 1

    Universidad Surcolom"iana   16de48

  • 8/18/2019 archivos- fundamentos

    17/48

    Ing Yamil Armando Cerquera [email protected]

    /a segunda +orma consiste en compro"ar si el car3cter ledo es el de +in dearc(ivo EO#,

    B(ile 0 letra^]E6- 1

    Cuando se tra"aja con arc(ivos de te8to no (ay ningNn pro"lema? pero si seest3 manejando un arc(ivo "inario se puede encontrar E6- antes del +in dearc(ivo. or eso es mejor usar +eo+.

    Ejemplo *, Utili;acin de la +uncin +scan+,

     /* Programa: Lee el archivo !amil.t"t #ue contiene n$meros en punto flotante ! calcula susuma.*/_include Hstdio.(void main0void1X int nW  /*variable para almacenar el valor devuelto por fscanf*/

    -I/E p+ic(W  /* Puntero al archivo */dou"le datoW  /* %lmacena el dato le&do del archivo */dou"le sumVtotW  /* 'uma de los datos */p+ic( ] +open0Qc,yamil.t8tQ? QrQ1Wi+ 0p+ic( ]] U//1

      X print+0QError, o se puede a"rir el arc(ivo Qyamil.t8tQnQ1W e8it0=1W   sumVtot ] >W  /* nicialiación de la suma antes de entrar en el bucle*/

    n ] +scan+0p+ic(?Kbl+Q?dato1WB(ile 0n^]E6- n^]>1  /* termina en cuanto ocurra un error de lectura*/ 

      X sumVtot]datoW  /* o digite el valor de cero   n ] +scan+0p+ic(?Kbl+Q? dato1W G /ee un dato del arc(ivo    print+0QEl valor de la suma es, bl+nQ? sumVtot1W

    i+0 +close0p+ic(1 ^] >1  X print+0QError al cerrar el arc(ivonQ1W e8it0=1W

    Si el arc(ivo yamil.t8t contiene,=.22.44.5

    =*2.4

    El resultado sera,El valor de la suma es, =2*.7>>>>>

    Universidad Surcolom"iana   17de48

  • 8/18/2019 archivos- fundamentos

    18/48

    Ing Yamil Armando Cerquera [email protected]

    /as +unciones +gets01? +puts01? getc01 +getc01? putc01 +putc01

    Son +unciones que escri"en o leen un car3cter 0+getc01? getc01? +putc01?putc011 o cadenas de caracteres 0+gets01? +puts011

    o reali;an conversin de +ormatos 0todo se (ace con caracteres1

    • /ectura de un car3cter,

    int ,getc0-I/E  puntero_a_archivo1 int getc0-I/E  puntero_a_archivo1 /een el siguiente car3cter del arc(ivo. Oalor de retorno,

    \8ito, el car3cter ledo -racaso, Si llega al +inal de arc(ivo u ocurre un error? el valor de

    retorno es E6-.

    • Escritura de un car3cter,

    int ,!utc0int car ? -I/E  puntero_a_archivo) óint !utc0int car ? -I/E  puntero_a_archivo) Escri"en el car3cter car en el arc(ivo al que apunta

     puntero_a_archivo.

    Oalor de retorno, \8ito, el propio car3cter escrito Error, E6-

    Ejemplo 2, Uso de la +uncin putc

    Juarda en el arc(ivo yamil.t8t caracteres pulsados en el teclado (asta quese presione la tecla enter. Este arc(ivo es guardado en la ra; de la unidad C.

    _include Hstdio.(_include Hstdli".(_include Hctype.(void main0void1X -I/E puntW

    c(ar cWpunt]+open0Qc,yamil.t8tQ?QBQ1Wi+ 0punt]]U//1

    Universidad Surcolom"iana   18de48

  • 8/18/2019 archivos- fundamentos

    19/48

    Ing Yamil Armando Cerquera [email protected]

      X print+0Qn Error – 6 SE UE!E ARIR E/ ARC$IO6Q1W e8it0=1W   do

    X c ] toupper0getc(ar011Wputc0c? punt1W

    B(ile 0c ^] n1W

    i+ 0+close0punt1 ^] >1X print+0QError al cerrar el arc(ivoQ1W e8it0=1W

    Ejemplo 4, Uso de la +uncin +getc

    Imprime el contenido del arc(ivo cuyo nom"re se pide al usuario lo digitepor teclado.

    _include Hstdio.(

    _include Hconio.(_de+ine TAFVCA! *57void main0void1X c(ar nomV+ic(ZTAFVCA![W G om"re del arc(ivo que se va a a"rir G

    c(ar letraW G car3cter ledo desde el arc(ivo y escrito en pantalla G-I/E p+ic(W G untero al arc(ivo que se imprime Gprint+0QIntrodu;ca el nom"re del arc(ivo que desea imprimir, Q1W

      gets0nomV+ic(1Wp+ic( ] +open0nomV+ic(? QrQ1Wi+ 0p+ic( ]] U//1

      X print+0QError al intentar a"rir el arc(ivo QbsQnQ? nomV+ic(1W  e8it0=1W   letra ] +getc0p+ic(1W

    B(ile0letra ^] E6-1  X print+0QbcQ? letra1Wletra ] +getc0p+ic(1W

      +close0p+ic(1W G Cierra el arc(ivo G  getc(01W

    Lectura de u$a cade$a de caracteres co$ la ,u$ci%$ ,gets&

    c(ar ,gets0c(ar cadena? int tam_cad ? -I/E  puntero_a_archivo1.

    • /ee una cadena de caracteres del arc(ivo apuntado por puntero_a_archivo y la almacena en cadena.

    • /a lectura se aca"a cuando se encuentra el car3cter nf 0que S se escri"een la cadena1? cuando se encuentra el +in de arc(ivo 0en este caso no seescri"e nf en la cadena1 o cuando se (an ledo tam_cad caracteres. En

    Universidad Surcolom"iana   19de48

  • 8/18/2019 archivos- fundamentos

    20/48

    Ing Yamil Armando Cerquera [email protected]

    todos estos casos? se escri"e un car3cter >f en la cadena a continuacindel Nltimo car3cter ledo.

    • Oalor de retorno, \8ito, es un puntero a la cadena leda.

    -racaso, U//? si se llega al +inal de arc(ivo u ocurre un error

    Escritura de u$a cade$a de caracteres co$ la ,u$ci%$ ,!uts

    int ,!uts0const c(ar cadena? -I/E  puntero_a_archivo)

    Escri"e la cadena en el arc(ivo al que apunta puntero_a_archivo SI E/ >f !E/ -IA/.

    Oalor de retorno, E8ito, nNmero positivo si se (a escrito la cadena correctamente

    Error, E6-Ejemplo 5, Uso de +puts y +gets sin control de errores al a"rir y cerrar

    /ectura de una cadena desde el teclado? escritura en un arc(ivo y lectura deesa cadena desde el arc(ivo reci'n creado.

    Suponiendo que no (ay ningNn tipo de error ni al a"rir el arc(ive ni alcerrarlo.

    _include Hstdio.(_include Hctype.(_include Hconio.(void main0void1X -I/E puntW  c(ar cadena=Z:>[? cadena*Z:>[W  clrscr01Wputs0Qn Introdu;ca una cadena de caracteres,nQ1W  gets0cadena=1W  punt]+open0Qc,yamil.t8tQ?QBQ1W  +puts0cadena=?punt1W  +close0punt1W  punt]+open0Qc,yamil.t8tQ?QrQ1W  +gets0cadena*?:>?punt1W  +close0punt1W

      puts0QnYa se (a ledo el arc(ivo y contiene,nQ1W  puts0cadena*1W  getc(01W

    Ejemplo 7, Uso de +puts y +gets con control de errores al a"rir y cerrar

    _include Hstdio.(

    Universidad Surcolom"iana   20de48

  • 8/18/2019 archivos- fundamentos

    21/48

    Ing Yamil Armando Cerquera [email protected]

    _include Hctype.(_include Hconio.(void main0void1X -I/E puntW  c(ar cadenaZ:>[W

      c(ar cadena*Z:>[W  punt]+open0Qc,yamil.t8tQ?QBQ1W  i+ 0punt]]U//1

    X print+0Qn Error al intentar a"rir el arc(ivoQ1W  e8it0=1W    puts0Qn Introdu;ca una cadena de caracteres,nQ1W gets0cadena1W  +puts0cadena?punt1W  i+ 0+close0punt1 ^] >1

    X print+0QError de arc(ivoQ1W e8it0=1W   punt]+open0Qc,yamil.t8tQ?QrQ1W

    i+ 0punt]]U//1  X print+0Qnerror de aperturaQ1W e8it0=1W   +gets0cadena*?:>?punt1W  i+ 0+close0punt1 ^] >1

    X print+0QError al cerrarQ1W e8it0=1W   puts0QnYa se (a ledo el arc(ivo y contiene,nQ1W puts0cadena*1W  getc(01W

    Ejemplo 9, Uso de +puts y +gets

    /ectura de una cadena desde el teclado? escritura en un arc(ivo y lectura deesa cadena desde el arc(ivo yamil.t8t

    _include Hstdio.(_include Hstdli".(_include Hctype.(_include Hconio.(void main0void1X -I/E puntW

    c(ar cadenaZ:>[Wc(ar cadena*Z:>[Wpunt]+open0Qc,yamil.t8tQ?QBQ1Wi+ 0punt]]U//1X print+0Qn Error # 6 SE UE!E ARIR E/ ARC$IO6 ARA ESCRIIRQ1W e8it0=1W puts0Qn Introdu;ca una cadena de caracteres,nQ1W gets0cadena1W

    +puts0cadena?punt1W G Es necesario volver a apuntar al principio del arc(ivo con el puntero G+gets0cadena*?:>?punt1Wi+ 0+close0punt1^]>1

      X print+0KError al cerrarL1W e8it0=1W   puts0Qn El arc(ivo contiene,nQ1W puts0cadena*1W

    getc(01W

    Universidad Surcolom"iana   21de48

  • 8/18/2019 archivos- fundamentos

    22/48

    Ing Yamil Armando Cerquera [email protected]

    Ejemplo :, Uso de la +uncin gets? +print+ y +scan+.

    _include Hstdio.(_include Hctype.(_de+ine TAF :>

    void main0void1X -I/E puntW

    c(ar cadenaZTAF[Wc(ar cadena*ZTAF[Wc(ar nom"reVarc(ivoZTAF[Wint nWprint+0KIntrodu;ca el nom"re del arc(ivoL1Wgets0nom"reVarc(ivo1Wpunt]+open0nom"reVarc(ivo?QBQ1Wi+ 0punt ]] U//1X print+0Qn Error al a"rir el arc(vio para escri"irQ1W e8it0=1W

      puts0Qn Introdu;ca una cadena de caracteres,nQ1W

    gets0cadena1W+print+0punt?QbsnQ?cadena1Wputs0Qn Introdu;ca una cadena de caracteres,nQ1Wi+ 0+close0punt1 ^] >1X print+0KError al cerrar el arc(ivo K1W e8it0=1W

      punt]+open0nom"reVarc(ivo?QrQ1Wi+ 0punt ]] U//1X print+0Qn Error al a"rir el arc(ivo para escri"irQ1W e8it0=1W

      puts0QnYa se (a ledo el arc(ivo y contiene,nQ1Wn ] +scan+0punt?QbZhn[nQ?cadena*1Wi+ 0n ]] E6- n ]] >1X print+0KError al leer la cadena *1W e8it0=1W

      puts0cadena*1W

    i+ 0+close0punt1 ^] >1X print+0KError al cerrar el arc(ivo K1W e8it0=1W

    Ejemplo

  • 8/18/2019 archivos- fundamentos

    23/48

    Ing Yamil Armando Cerquera [email protected]

      letra]getc0origen1W  B(ile 0+eo+0origen1]]>1  X i+ 0^strc(r0QAEI6UaeiouQ?letra11 putc0 letra? destino 1W  letra]getc0origen1W 

      i+ 0+close0origen1^]>1  print+0 Qro"lemas al cerrar el arc(ivo origen.t8tnQ 1W  i+ 0+close0destino1^]>1  print+0 Qro"lemas al cerrar el arc(ivo destino.t8tnQ 1W

    Si el arc(ivo origen.t8t tiene la siguiente in+ormacin

    El pro+esor yamil armando cerqueraEs docente del programa de ingeniera electrnicaY orienta el curso taller de programacin

    El arc(ivo destino.t8t contendr3 lo siguiente despu's de aplicado el cdigoanterior.

    l pr+sr yml rmnd crqrs dcnt dl prgrm d ngnr lctrncY rnt l crs tllr d prgrmcn

    Si se (u"iera querido quitar tam"i'n las vocales tildadas cam"ie lo siguiente,

      i+ 0^strc(r0QAEI6Uaeiou3'N\kQ?letra11 putc0 letra? destino 1W

    Ejemplo =>, Almacenamiento de estructuras en arc(ivos de tipo te8to(aciendo uso de la +uncin +print+.

    _include Hstdio.(_include Hstdli".(_include Hstring.(_de+ine *  /* Dimensión de los vectores (n$mero de productos) */typede+ struct  /* Declaración de una estructura para los productos */X c(ar nom"reZ=*[W

    int estaturaW R6!W

    void main0void1X R6! productoZ[W G Oector de productos en el almac'n Gint iW G contadorG-I/E +W G puntero + a la ;ona de "u++er G

     G Se iniciali;a el vector con los siguientes datos Gstrcpy0productoZ>[.nom"re?QYamil CerqueraQ1WproductoZ>[.estatura]=9

  • 8/18/2019 archivos- fundamentos

    24/48

    Ing Yamil Armando Cerquera [email protected]

      productoZ=[.estatura]=:>W G Se Crea el arc(ivo G+ ] +open0Qc,yamil.t8tL?QBQ1Wi+ 0+ ]]U//1X print+0QError al crear el arc(ivo datos.t8tnQ1W

    e8it0=1W

      +or 0i ] >W iHW i1X +print+0+?QbsnQ?productoZi[.nom"re1W

    +print+0+?Qb7dnQ?productoZi[.estatura1W

      +close0+1W

    Una ve; ejecutado el programa? se crea un arc(ivo en la ra; del disco duroC? el cual contendr3 la siguiente in+ormacin.

    Resultado, al a"rir el arc(ivo Kc,datos.t8tL con un editor de te8to ver3 lossiguientes 25 caracteres.

    Yamil Cerquera=9<

    Armando Rojas=:>

    Arc(ivos inarios

    /os arc(ivos "inarios se utili;an para almacenar la in+ormacin como unacopia e8acta de la memoria del ordenador.

    ormalmente? no se pueden ver con un editor de te8to? pues sera unacasualidad que los "ytes que contienen +uesen caracteres legi"les.

    til cuando se desea guardar en un arc(ivo "loques de in+ormacin. ermiteescri"ir los "loques de una sola ve; sin necesidad de escri"ir cada uno de suscomponentes.

    ro"lema de porta"ilidad

    ermiten el acceso directo a los datos en el arc(ivo. En estos casos seutili;an las +unciones +Brite01 y +read01,

    Am"as +unciones (acen un acceso directo a la memoria del ordenador apartir de la direccin donde inicia la estructura de tipo +L,.

    Universidad Surcolom"iana   24de48

  • 8/18/2019 archivos- fundamentos

    25/48

    Ing Yamil Armando Cerquera [email protected]

    Escritura,

    #0rite

    Empecemos con f-rite? que nos permite escri"ir en un arc(ivo. Esta +uncintiene el siguiente +ormato,

    si;eVt +Brite0void estructura? si;eVt tamano? si;eVt numero? -I/E parc(ivo1W

    • "u++er # varia"le que contiene los datos que vamos a escri"ir en elarc(ivo.

    • tamano # el tamaMo del tipo de dato a escri"ir. uede ser un int? un

    +loat? una estructura? ... ara conocer su tamaMo usamos el operadorsieof .• numero # el nNmero de datos a escri"ir.• parc(ivo # El puntero al arc(ivo so"re el que tra"ajamos.

    ara que quede m3s claro e8amine el siguiente ejemplo, un programa deagenda que guarda el nom"re? apellido y tel'+ono de cada persona.

    Ejemplo ==, Uso de la -uncin +Brite

    _include Hstdio.(_include Hconio.(structX c(ar nom"reZ*>[W  c(ar apellidoZ*>[W  c(ar tele+onoZ=5[W  registroW

    int main01X -I/E arc(ivoW  arc(ivo ] +open0 Qc,yamil.t8t Q? QaQ 1W  do

    X print+0 Qom"re, Q 1W ++lus(0stdout1W gets0registro.nom"re1W  i+ 0strcmp0registro.nom"re?QQ11

      X print+0 QApellido, Q 1W ++lus(0stdout1W gets0registro.apellido1W  print+0 QTel'+ono, Q 1W ++lus(0stdout1W gets0registro.tele+ono1W  ,0rite- 1registro" si2eo,-registro" 3" arc)i*o 4    B(ile 0strcmp0registro.nom"re?QQ1^]>1W

    +close0 arc(ivo 1Wgetc(01W

    Universidad Surcolom"iana   25de48

  • 8/18/2019 archivos- fundamentos

    26/48

    Ing Yamil Armando Cerquera [email protected]

    6TA, El "ucle termina cuando el nom"re se deja en "lanco.

    Este programa guarda los datos personales mediante +Brite usando la

    estructura registro. Se a"re el arc(ivo en modo a 0append? aMadir1? paraque los datos que se incorporan? lo (agan al +inal del arc(ivo.

    Una ve; a"ierto se a"re con un "ucle do-hile mediante el cual se introducenlos datos. /os datos se van almacenando en la varia"le registro 0que es unaestructura1. Una ve; se tienen todos los datos de la persona? se escri"en enel arc(ivo con +Brite,

    +Brite0 registro? si;eo+0registro1? =? arc(ivo 1W

    • registro # es la varia"le 0en este caso una estructura1 que contiene lain+ormacin a guardar en el arc(ivo.

    • si;eo+0registro1 – Se utili;a para sa"er cu3l es el nNmero de "ytes quedesea guardar? el tamaMo en "ytes que ocupa la estructura.

    • = # indica que slo se guarda un elemento. Cada ve; que se recorre el"ucle se guarda un slo un elemento.

    • arc(ivo # el puntero -I/E al arc(ivo donde se desea escri"ir.

    /ectura,

    #read

    /a +uncin fread  se utili;a para sacar in+ormacin de un arc(ivo. Su +ormatoes,

    si;eVt +read0void "u++er? si;eVt tamano? si;eVt numero? -I/E parc(ivo1W

    Siendo buffer  la varia"le donde se van a escri"ir los datos ledos del arc(ivo parchivo.

    El valor que devuelve la +uncin indica el nNmero de elementos de tamaMo

    tamano que (a conseguido leer. Se puede pedir a +read que lea =>elementos 0numero]=>1? pero si en el arc(ivo slo (ay 7 elementos +readdevolver3 el nNmero 7.

    Siguiendo con el ejemplo anterior a(ora se leen los datos que se (a"anguardado en Qc,yamil.t8tQ.

    Universidad Surcolom"iana   26de48

  • 8/18/2019 archivos- fundamentos

    27/48

    Ing Yamil Armando Cerquera [email protected]

    Ejemplo =*, Uso d ela +uncin +read.

    _include Hstdio.(_include Hconio.(struct

    X c(ar nom"reZ*>[W  c(ar apellidoZ*>[W  c(ar tele+onoZ=5[W registroW

    int main01X -I/E arc(ivoW  arc(ivo ] +open0 Qc,yamil.t8tQ? QrQ 1W

    B(ile 0^+eo+0arc(ivo11X i+ 0,read- 1registro" si2eo,-registro" 3" arc)i*o 1

    X print+0 Qom"re, bsnQ? registro.nom"re 1W  print+0 QApellido, bsnQ? registro.apellido1W  print+0 QTel'+ono, bsnQ? registro.tele+ono1W   

    +close0 arc(ivo 1Wgetc(01W

    Se A"re el arc(ivo c:!amil.t"t  en modo lectura. Con el "ucle B(ile nosaseguramos que recorremos el arc(ivo (asta el +inal 0y que no nospasamos1.

    /a +uncin +read lee un registro 0numero]=1 del tamaMo de la estructuraregistro. Si realmente (a conseguido leer un registro la +uncin devolver3 un=? en cuyo caso la condicin del i+ ser3 verdadera y se imprimir3 el registroen la pantalla. En caso de que no queden m3s registros en el arc(ivo? +readdevolver3 > y no se mostrar3 nada en la pantalla.

    Estructuras guardadas en arc(ivos "inarios,

    Eem!lo 35, Almacenamiento de estructuras en arc(ivos de "inarios.

    /os datos son colocados desde el momento de la edicin del programa en la

    estructura. 

    _include Hstdio.(_include Hstdli".(_include Hstring.(_de+ine *  /* Dimensión de los vectores (n$mero de productos) */

     /* Declaración de una estructura para los productos */  typede+ struct

    Universidad Surcolom"iana   27de48

  • 8/18/2019 archivos- fundamentos

    28/48

    Ing Yamil Armando Cerquera [email protected]

    X c(ar nom"reZ=*[Wint estaturaW

    R6!Wvoid main0void1X R6! prodZ[W G Oector de productos en el almac'n G

    int iW G contador para los "uclesG-I/E +W G !escriptor del arc(ivo de te8to G G Iniciali;o del vector Gstrcpy0prodZ>[.nom"re?QYamil CerqueraQ1WprodZ>[.estatura]=9W iHW i1 +Brite0prodZi[?si;eo+0prodZi[1?=?+1W  +close0+1W

    B", a"re el arc(ivo para escritura en modo "inario.

    Resultado, no se puede ver pero ocupa *: caracteres ya que cada estructuraocupa =4 "ytes (a"lando en programacin =7 "its 0el tipo int ocupa dos 0*1"ytes1

    Ejemplo =4, Almacenamiento de estructuras en arc(ivos de "inarios.

    /os datos son ledos desde el teclado y pasados directamente al arc(ivo"inario. 

    _include Hstdio.(_include Hconio.(_include Hstdli".(typede+ c(ar TVCadena2>Z2>[Wtypede+ structX TVCadena2> nom"reW

    int edadW TV-ic(aWvoid main0void1X -I/E puntW TV-ic(a +ic(aW TV-ic(a +ic(a*W

    punt]+open0Qc,yamil.t8tQ?QB"Q1W

    i+ 0punt]]U//1 X print+0Qn Error al a"rir el arc(ivo Q1W e8it0=1W   print+0QIntrodu;ca el nom"re de la persona,nQ1W gets0+ic(a.nom"re1W

    print+0QIntrodu;ca la edad de la persona,nQ1W scan+0QbdQ?+ic(a.edad1W+Brite0+ic(a? si;eo+0TV-ic(a1? =? punt1Wi+ 0+close0punt1 ^] >1 X print+0KError al cerrar el arc(ivo K1W e8it0=1W punt]+open0Qc,,yamil.t8tQ?Qr"Q1Wi+ 0punt]]U//1 X print+0Qn Error al a"rir el arc(ivo Q1W e8it0=1W

      puts0QnYa se (a ledo el arc(ivo y contiene,nQ1W

    Universidad Surcolom"iana   28de48

  • 8/18/2019 archivos- fundamentos

    29/48

    Ing Yamil Armando Cerquera [email protected]

      +read0+ic(a*? si;eo+0TV-ic(a1? = ? punt1Wprint+0Q6FRE, Q1W puts0+ic(a*.nom"re1Wprint+0QE!A!, Q1W print+0QbdQ?+ic(a*.edad1Wi+ 0+close0punt1 ^] >1 X print+0KError al cerrar el arc(ivo K1W e8it0=1W

      punt]+open0Qc,yamil.t8t Q?Qr"Q1W

    i+ 0punt]]U//1X print+0Qn Error a"riendo el arc(ivo Q1W e8it0=1W   puts0QnYa se (a ledo el arc(ivo y contiene,nQ1W

    +or 0cont]>WcontHWcont1X +read0listaZcont[? si;eo+0TV-ic(a1?=?punt1W

      print+0Q6FRE, Q1W puts0listaZcont[.nom"re1W  print+0QE!A!, Q1W print+0QbdnQ?listaZcont[.edad1W 

    i+ 0+close0punt1 ^] > 1 X print+0KError al cerrar el arc(ivoL1W e8it0=1W   getc(01W

    Ejemplo =5, Uso de ++lus(? +Brite_include Hstdio.(_include Hstdli".(_de+ine 5typede+ structX c(ar nom"reZ2>[W  int edadW TV-ic(aWvoid main0void1X -I/E puntW  TV-ic(a +ic(aW  TV-ic(a listaZ[W

      int contW  punt]+open0Kc,yamil.t8tQ?QB"Q1W  i+ 0punt]]U//1 X print+0Qn Error a"riendo el arc(ivo Q1W e8it0=1W   +or 0cont]>WcontHWcont1

    X ++lus(0stdin1W  print+0QIntrodu;ca el nom"re de la persona,nQ1W gets0+ic(a.nom"re1W  print+0QIntrodu;ca la edad de la persona,nQ1Wscan+0QbdQ?+ic(a.edad1W  +Brite0+ic(a? si;eo+0TV-ic(a1? =? punt1W 

    Eem!lo 36& 7so de la ,u$ci%$ ,read

    _include Hstdio.(_include Hstdli".(_de+ine 5typede+ structX c(ar nom"reZ2>[W  int edadW TV-ic(aW

    Universidad Surcolom"iana   29de48

  • 8/18/2019 archivos- fundamentos

    30/48

    Ing Yamil Armando Cerquera [email protected]

    void main0void1X -I/E puntW  TV-ic(a +ic(aW  TV-ic(a listaZ[W  int contW

      punt]+open0Kc,yamil.t8tQ?QB"Q1W  i+ 0punt]]U//1 X print+0Qn Error a"riendo el arc(ivo Q1W e8it0=1W   +or 0cont]>WcontHWcont1

    X ++lus(0stdin1W  print+0QIntrodu;ca el nom"re de la persona,nQ1W gets0+ic(a.nom"re1W  print+0QIntrodu;ca la edad de la persona,nQ1W scan+0QbdQ?+ic(a.edad1W  +Brite0+ic(a? si;eo+0TV-ic(a1? =? punt1W    I+ 0+close0punt1 ^] > 1 X print+0KError al cerrar el arc(ivoL1W e8it0=1W   punt]+open0Qc,yamil.t8t Q?Qr"Q1W  i+ 0punt]]U//1 X print+0Qn Error a"riendo el arc(ivo Q1W e8it0=1W   puts0QnYa se (a ledo el arc(ivo y contiene,nQ1W  +read0lista? si;eo+0TV-ic(a1? ?punt1W  +or 0cont ] >W cont H W cont1

    X print+0Q6FRE, Q1W puts0listaZcont[.nom"re1W  print+0QE!A!, Q1W print+0QbdnQ?listaZcont[.edad1W    i+ 0+close0punt1 ^] > 1 X print+0KError al cerrar el arc(ivoL1W e8it0=1W

    Acceso directo a registros en arc(ivos "inarios

    #u$ci%$ ,see8

    $ay veces en que se necesita acceder una y otra ve; al +ic(ero para leer susdatos? modi+icar parte de ellos? por el medio. Imagine? por ejemplo? que setiene guardado en un arc(ivo una agenda de tel'+onos? con los amigos. Aveces se quiere consultar uno que est' en medio del arc(ivo? o cam"iar sunNmero de tel'+ono? o "orrarlo como amigo porque ya n o est3 o no se deseatener.

    C o+rece esta posi"ilidad. /a +uncin ,see8- permite despla;arse

    r3pidamente? sin necesidad de ir leyendo registro a registro? (asta unaposicin concreta de un +ic(ero. Esto es lo que se conoce como accesoaleatorio a un +ic(ero.

    /a +uncin fseek  permite situar en la posicin que se desee de un arc(ivoa"ierto. Cuando se lee un arc(ivo (ay un puntero o cursor que indica enqu' lugar del arc(ivo se encuentra. Cada ve; que se lea datos del arc(ivo?

    Universidad Surcolom"iana   30de48

  • 8/18/2019 archivos- fundamentos

    31/48

    Ing Yamil Armando Cerquera [email protected]

    este puntero se despla;a un registro adelante. Con la +uncin fseek   sepuede situar este puntero en el lugar que se desee.

    rototipo, int ,see80-I/E archivo? long  posición? int origen1W

    Oalor de retorno,

    \8ito, devuelve > 0el puntero del arc(ivo se despla;satis+actoriamente1

    Error, devuelve un valor distinto de >

    /os par3metros de entrada son, un puntero a una estructura -I/E del arc(ivoen el que se quiere cam"iar el cursor de lecturaGescritura? el valor deldespla;amiento y el punto de origen desde el que se calcular3 el

    despla;amiento. archivo, untero al "u++er del arc(ivo con el que se esta tra"ajando.  posición: Desplaamiento en "ytes a partir de lo que indique origen.

    'on las posiciones 0o "ytes1 que se quiere despla;ar el puntero.Este despla;amiento puede ser de tres tipos dependiendo del valorde modo,

    origen, Especi+ica donde comien;a la "Nsqueda. El par3metro origenpuede tener tres posi"les valores,

    • SEE9:C7R& El despla;amiento se cuenta desde la posicinactual del cursor.

    • SEE9:END& El despla;amiento se cuenta desde el +inal del+ic(ero.

    • SEE9:SET& el despla;amiento se cuenta desde el principio del+ic(ero. El primer "yte del +ic(ero tiene un despla;amientocero. 

    Estas tres constantes est3n de+inidas en el +ic(ero Hstdio.(. Comocuriosidad se indican a continuacin sus de+iniciones,

    _de+ine SEEVSET >

    _de+ine SEEVCUR =_de+ine SEEVE! *

    ota, es posi"le que los valores cam"ien de un compilador a otro.

    Eem!lo 3;& Di,ere$tes usos de la Co$sta$te See8

    Universidad Surcolom"iana   31de48

  • 8/18/2019 archivos- fundamentos

    32/48

    Ing Yamil Armando Cerquera [email protected]

    +see0+p?=?SEEVSET1W G Oa a la primera posicin del arc(ivo G+see0+p?=>si;eo+0productoZ>[1?SEEVSET1W G Oa al d'cimo producto del arc(ivoG+see0+p?*si;eo+0productoZ>[1?SEEVCUR1W G Se salta dos masG

    Eem!lo 3

  • 8/18/2019 archivos- fundamentos

    33/48

    Ing Yamil Armando Cerquera [email protected]

    _include Hstdio.(_include Hstring.(int main01X c(ar nom"reZ==[ ] Qyamil.datQ? mensajeZ:=[]QQW  -I/E +ic(eroW

      long int comien;o? +inalW  +ic(ero ] +open0 nom"re? QrQ 1W  print+0 Q-ic(ero, bs # Q? nom"re 1W  i+0 +ic(ero 1  print+0 Qe8iste 0AIERT61nQ 1W  else  X print+0 QError 06 AIERT61nQ 1W  return =W    i+0 0comien;o]+tell0 +ic(ero 11 H > 1 print+0 QERR6R, +tell no (a +uncionado nQ 1W  else print+0 Qosicin del +ic(ero, bd n nQ? comien;o 1W  +see0 +ic(ero? >/? SEEVE! 1W  +inal ] +tell0 +ic(ero 1W  +see0 +ic(ero? >/? SEEVSET 1W  +gets0 mensaje? :>? +ic(ero 1W  print+0 QTamaMo del +ic(ero QbsQ, bd "ytes nQ? nom"re? +inal#comien;o= 1W  print+0 QFensaje del +ic(ero, n bs nQ? mensaje 1W  print+0 QTamaMo del mensaje 0usando strlen1, bd nQ? strlen0mensaje1 1W  i+0 ^+close0+ic(ero1 1  print+0 Q-ic(ero cerradonQ 1W  else  X print+0 QError, +ic(ero 6 CERRA!6nQ 1W  return =W    return >W

    Eem!lo >?, Arc(ivos "inarios usando la +uncin +see01

    _include Hstdio.(_include Hstdli".(_include Hstring.(typede+ structX c(ar nom"reZ2>[W

    int edadW TV-ic(aWtypede+ TV-ic(a TV/istaZ=>[Wvoid introducirVdatos0TV/ista lista1Wvoid escri"eVdatos0TV/ista lista1Wvoid guardarVarc(ivo0TV/ista lista1Wvoid cargarVarc(ivo0TV/ista lista1Wvoid modi+icar0void1W

    void main0void1X TV/ista lista?lista*W

    introducirVdatos0lista1WguardarVarc(ivo0lista1W

    Universidad Surcolom"iana   33de48

  • 8/18/2019 archivos- fundamentos

    34/48

    Ing Yamil Armando Cerquera [email protected]

      modi+icar01WcargarVarc(ivo0lista*1Wescri"eVdatos0lista*1W

    void introducirVdatos0TV/ista lista1X int contWprint+0QIntrodu;ca los nom"res y edades de 5 personas, nQ1W+or 0cont]>WcontH5Wcont1X ++lus(0stdin1W

    print+0QIntrodu;ca nom"re,nQ1W gets0listaZcont[.nom"re1Wprint+0QIntrodu;ca edad,nQ1W scan+0QbdQ?listaZcont[.edad1W

    void escri"eVdatos0TV/ista lista1X int contW

    print+0Qn,,,,,/os datos del arc(ivo ledo son,nQ1W+or 0cont]>WcontH5Wcont1X print+0Q6FRE, Q1W puts0listaZcont[.nom"re1W

    print+0QE!A!, Q1W print+0QbdnQ?listaZcont[.edad1W

    void guardarVarc(ivo0TV/ista lista1X -I/E puntW int contW

    print+0QnJUAR!A!6 ARC$IO6....nQ1Wpunt]+open0Qc,yamil.t8tQ?QB"Q1Wi+ 0punt]]U//1X print+0QnERR6RQ1W e8it0=1W

      +or0cont]>WcontH5Wcont1X +Brite0listaZcont[?si;eo+0TV-ic(a1?=?punt1W   G 6tra opcin en ve; del "ucle anterior

    +Brite0lista?si;eo+0TV-ic(a1?5?punt1W Gi+ 0+close0punt1 ^] >1X print+0KError al cerrar el arc(ivoL1W e8it0=1W print+0Qn,,,,,ARC$IO6 JUAR!A!6,,,,,nQ1W

    void cargarVarc(ivo0TV/ista lista1X -I/E puntW

    int cont]>Wprint+0Qn/EYE!6 ARC$IO6.................nQ1W

    punt]+open0Qc,yamil.t8tQ?Qr"Q1Wi+ 0punt]]U//1X print+0Qn Error al a"rir el arc(ivoQ1W

    e8it0=1W

      B(ile 0 +read0listaZcont[?si;eo+0TV-ic(a1?=?punt11 ]] =1X contW

      i+ 0+close0punt1 ^] >1

    Universidad Surcolom"iana   34de48

  • 8/18/2019 archivos- fundamentos

    35/48

    Ing Yamil Armando Cerquera [email protected]

      X print+0KError cerrando el arc(ivo K1We8it0=1W

      print+0Qn,,,,,ARC$IO6 /EI!6,,,,,nQ1W

    void modi+icar0void1X -I/E puntW TV-ic(a registroW

    int cont]>WTVCadena2> cadenaW++lus(0stdin1Wprint+0Qn Introdu;ca nom"re a "uscar,nQ1Wgets0cadena1Wprint+0Qn /eyendo -ile y uscando ame solicitado .....nQ1Wpunt]+open0Qc,yamil.t8tQ?Qr"Q1Wi+ 0punt]]U//1X print+0QnERR6RQ1W e8it0=1W doX +read0registro?si;eo+0TV-ic(a1?=?punt1W

    contW B(ile 00strcmp0registro.nom"re?cadena1^]>10contH511Wi+ 0strcmp0registro.nom"re?cadena1]]>1X print+0Qn...I!IOI!U6 EC6TRA!6.....nQ1W

      print+0Qn...!AT6S ACTUA/ES,nQ1W  print+0Q6FRE, bsnQ?registro.nom"re1W  print+0QE!A!, bdnQ?registro.edad1W  print+0Qn,,,,,ITR6!UCA UEO6S !AT6S,,,,,,nQ1W

    ++lus(0stdin1Wprint+0QIntrodu;ca el nom"re de la persona,nQ1Wgets0registro.nom"re1W

    print+0QIntrodu;ca la edad de la persona,nQ1Wscan+0QbdQ?registro.edad1Wprint+0Qn F6!I-ICA!6 /6S !AT6S E E/ ARC$IO6...nQ1W+see0punt?0cont#=1si;eo+0TV-ic(a1?SEEVSET1W+Brite0registro?si;eo+0TV-ic(a1?=?punt1W

      print+0Qn..!AT6S F6!I-ICA!6S E E/ ARC$IO6....nQ1Welse

    print+0Qn,El nom"re solicitado no se encuentra en el +ile,nQ1Wi+ 0+close0punt1 ^] >1X print+0Qn,,,,,ARC$IO6 JUAR!A!6,,,,,nQ1W e8it0=1W

    Ejemplo *=, Arc(ivos

    age 79 El lenguaje de programacin C U austral C(ile.

    _includeHiostream.(_includeHstring.(_includeHstdio.(

    Universidad Surcolom"iana   35de48

  • 8/18/2019 archivos- fundamentos

    36/48

    Ing Yamil Armando Cerquera [email protected]

    _includeHctype.(_includeHprocess.(_includeHstdli".(_de+ine ma8i =>>_include Hvcl.(

    _include Hconio.(_include Hs.cpp GG de"e quedar guardada en la li"rera_pragma (drstop_pragma argsusedstruct alumnoX c(ar nom"reZ2>[W  c(ar direccionZ5>[W  c(ar ciudadZ*>[W  int codVareaW  unsigned long int +onoW datosZma8i[Wvoid iniVlista01? ingresar01? mostrar01? guardar01? cargar01Wc(ar menu01W

    int main01X c(ar eligeW  iniVlista01W  +or0WW1  X elige]menu01W  sBitc(0elige1  X case i,ingresar01W"reaW  case m,mostrar01W"reaW  case g,guardar01W"reaW  case c,cargar01W"reaW  case s,e8it0=1W

        getc(01W  return >W

     G iniciali;a arreglo Gvoid iniVlista01X +or0int i]>W iHma8i W i1  datosZi[.nom"re]>W

     G menN de seleccin Gc(ar menu01

    X GGc(ar sW  GG o se puede usar  c(ar sZ:>[W

    doX clrscr01W

      coutHHQ 0I1 Ingresar nQW  coutHHQ 0F1 Fostrar nQW  coutHHQ 0C1 Cargar nQW

    Universidad Surcolom"iana   36de48

  • 8/18/2019 archivos- fundamentos

    37/48

    Ing Yamil Armando Cerquera [email protected]

      coutHHQ 0J1 Juardar nQW  coutHHQ 0S1 Salir nQW  GGs]getc(01W  GG o se puede usar tam"i'n gets0s1 con+ con enterW  gets0s1W

      B(ile0^strrc(r0QimcgsQ?toloBer0s111W  return c(ar0toloBer0s11W

     G Ingreso de nom"res a la lista Gvoid ingresar01X int iW  +or0i]>W iHma8iW i1  i+0^datosZi[.nom"re1 "reaW  i+0i]]ma8i1  X coutHHQ/a lista esta llena nQW  returnW   cout HH Q nom"re , QWgets0datosZi[.nom"re1W  cout HH Q direccion , QWgets0datosZi[.direccion1W  cout HH Q ciudad , QWgets0datosZi[.ciudad1W  cout HH Q cdigo de 3rea , QWcin datosZi[.codVareaW  cout HH Q tel'+ono , QWcin datosZi[.+onoW

     G Fostrar la lista Gvoid mostrar01X +or0int i]>W iHma8i W i1  X i+0datosZi[.nom"re1  X coutHHnHHdatosZi[.nom"reW  coutHHnHHdatosZi[.direccionW

      coutHHnHHdatosZi[.ciudadW  coutHHnHHdatosZi[.codVareaW  coutHHQ#QHHdatosZi[.+onoW  coutHHnW      getc(01W

     G Juardar la lista Gvoid guardar01X -I/E +pW  +p]+open0Qc,GGprue"aGGdatos.t8tQ?QaQ1W

      i+0+p]]U//1  X coutHHQno se puede a"rir el arc(ivo nQW  returnW   +or0int i]>W iHma8iW i1  i+0datosZi[.nom"re1  i+0+Brite0datosZi[?si;eo+0struct alumno1?=?+p1^]=1  coutHHQ Error de escritura en el arc(ivo nQW  +close0+p1W

    Universidad Surcolom"iana   37de48

  • 8/18/2019 archivos- fundamentos

    38/48

    Ing Yamil Armando Cerquera [email protected]

     G Cargar el arc(ivo Gvoid cargar01X -I/E +pW

      +p]+open0Qc,GGprue"aGGdatos.t8tQ?QrQ1W  i+0+p]]U//1  X cout HH Q o se puede a"rir el arc(ivo nQW returnW   iniVlista01W  +or0int i]>W iHma8iW i1  i+0+read0datosZi[?si;eo+0struct alumno1?=?+p1^]=1  X i+0+eo+0+p11  X +close0+p1W returnW W  coutHHQError de lectura en el arc(ivo nQW 

    Arc(ivos con Derarqua de clasesara manipular los arc(ivos? C nos presenta una jerarqua de clasesespecialmente diseMadas para ello. !onde nos concentraremos en dos deellas, i+stream para manipular arc(ivos de entrada de datos y o+stream paramanipular arc(ivos de salida de datos.

    E8isten algunas operaciones "3sicas que se reali;an so"re los arc(ivos? estasson,

    Creacin del o"jeto. Apertura del arc(ivo. Fanipulacin del arc(ivo. Cierre del arc(ivo.

    Creaci%$ del o(eto.

    ara la creacin del o"jeto de"emos declarar una varia"le cuyo tipo esalgunas de las clases nom"radas. or ejemplo? si queremos un tra"ajar conun arc(ivo de entrada de datos? declaramos,

    i+stream Arc(ivoEntW

    Si el arc(ivo +uera de salida de datos? declaramos,

    o+stream Arc(ivoSalW

    Universidad Surcolom"iana   38de48

  • 8/18/2019 archivos- fundamentos

    39/48

    Ing Yamil Armando Cerquera [email protected]

    A!ertura del arc)i*o.

    /a apertura de un arc(ivo esta"lece la cone8in entre el nom"re lgico y el

    nom"re +sico de nuestro arc(ivo? a"re el arc(ivo y lo prepara para sumanipulacin.

    Esto se puede reali;ar de dos maneras? la primera es a trav's del m'todoopen,

    void o!e$0const c(ar nombre_archivo? openmode modo1W

    Este m'todo puede reci"ir dos par3metros? el primero es una cadena decaracteres que representa el nom"re +sico del arc(ivo que ser3 a"ierto? yopcionalmente puede reci"ir un segundo par3metro que representa al modo

    que se a"rir3.

    uede ser alguna de las siguientes opciones,

    ios,,in A"re el arc(ivo para lecturaios,,out A"re el arc(ivo para escrituraios,,ate A"re un arc(ivo e8istente y se posiciona al +inalios,,app A"re un arc(ivo de salida para agregar al +inalios,,nocreate A"re un arc(ivo slo si ya e8iste.ios,,noreplace A"re un arc(ivo slo si no e8iste.

    ios,,trunc A"re un arc(ivo? si ya e8iste "orra todo su contenidoios,,"inary A"re un arc(ivo en modo "inario. or de+ecto es modote8to.

    Estas opciones se pueden com"inar utili;ando el operador or ? pero no todaslas com"inaciones son posi"les. Un ejemplo seria,

    Arc(ivoSal.open0Kdatos.t8tL? ios,,out ios,,app1W

    Como dijimos anteriormente? el modo de apertura es un par3metro opcionaldel m'todo? dado que de acuerdo a la clase (ayamos creado el o"jeto? poseeun modo de apertura por de+ecto. Estos son,

    Clase odo !or de,ecto

    o+stream ios,,out ios,,trunci+stream ios,,in

    Universidad Surcolom"iana   39de48

  • 8/18/2019 archivos- fundamentos

    40/48

  • 8/18/2019 archivos- fundamentos

    41/48

    Ing Yamil Armando Cerquera [email protected]

    Estas acciones? se pueden reali;ar mediante operadores o llamadas am'todos.

    O!eradores de lectura escritura

    E8isten dos operadores,

    3. O!erador de i$serci%$& BB

    Este operador permite insertar o escri"ir dentro del arc(ivo un te8to. El te8topuede ser una cadena de caracteres o no? gracias a que estas clases sa"enreali;ar la conversin de tipo de +orma autom3tica. Oamos a ver algunosejemplos,

    C%digo eem!lo Arc)i*o salida

    En este primer ejemplo vemos como se inserta una simple cadena decaracteres a un arc(ivo de te8to tipo o+stream llamado Arc(ivoSal

    Arc(ivoSal HH KalumnoLW alumno

    En el siguiente ejemplo? se puede tener el mismo e+ecto insertando elcontenido de la varia"le Te8to.

    string Te8to ] K$olaL Arc(ivoSal HH Te8toW $ola

    En este ejemplo? vemos que se pueden reali;ar inserciones sucesivas dedentro de una misma +ila? con la separacin de un car3cter de espacio que sereali;a de +orma autom3tica. Al +inal de cada rengln agregamos endl parainsertar un caracter de +in de lnea? para movernos a la siguiente lnea.

    string Te8to ] K$olaLWArc(ivoSal HH Te8to HH K=L HH endlWArc(ivoSal HH Te8to HH K *L HH endlW

    $ola=$ola*

    A(ora vea que se puede tam"i'n reali;ar la insercin del contenido unavaria"le entera? cuyo contenido se convierte de +orma autom3tica en unacadena de caracteres. Adem3s se puede o"servar otra +orma de insertar elcaracter de +in de lnea agregando n

    Universidad Surcolom"iana   41de48

  • 8/18/2019 archivos- fundamentos

    42/48

    Ing Yamil Armando Cerquera [email protected]

    int num ] =WArc(ivoSal HH num HH K$olanLWumWArc(ivoSal HH num HH K $olanLW

    =$ola

    * $ola

    or Nltimo se muestra un ejemplo completo? con muc(as com"inaciones deguardado? para que analicen la salida.

    string Te8to= ] Q$olaQWstring Te8to* ] QFundoQWint num ] =WArc(i HH Te8to= HH Te8to* HH endlWArc(i HH Te8to= HH Q Q HH Te8to* HH endlWArc(i HH num HH num HH endlWArc(i HH num HH Q Q HH num HH endlWArc(i HH num HH Q Q HH num HH endlWArc(i HH Te8to= HH num HH QnQWArc(i HH num HH Te8to* HH endlW

    $olaFundo$ola Fundo*=2 *2 2$ola44Fundo

    >. O!erador de etracci%$&

    Este operador permite e8traer del contenido de arc(ivo? un te8to. Esteoperador e8trae todo el contenido de la cadena y se lo asigna a la varia"le(asta que encuentre un caracter de espacio o de +in de lnea. Similar alanterior? el te8to puede ser una cadena de caracteres o no? gracias a que

    estas clases sa"en reali;ar la conversin de tipo de +orma autom3tica? laconversin se reali;ar3 de acuerdo al tipo de dato de la varia"le quede+inamos. Oamos a ver algunos ejemplos,

    C%digo eem!lo Arc)i*o e$trada*aria(les

    En este primer ejemplo vemos como e8trae una simple cadena de caracteresde un arc(ivo de te8to tipo i+stream llamado Arc(ivoEnt.

    string Te8toW

    Arc(ivoEnt Te8toW

    alumno

    Te8to ] KalumnoL 

    En este par de ejemplos? se ve como el mismo cdigo permite leer cadenasde caracteres sucesivas independientes que est'n separadas por un caracterde espacio o de +in de lnea.

    Universidad Surcolom"iana   42de48

  • 8/18/2019 archivos- fundamentos

    43/48

    Ing Yamil Armando Cerquera [email protected]

    string Te8to=? Te8to*WArc(ivoEnt Te8to= Te8to*W

    alumno= alumno*Te8to= ] Kalumno=L Te8to* ] Kalumno*L alumno=

    alumno*string Te8to=? Te8to*WArc(ivoEnt Te8to= Te8to*W

    Te8to= ] Kalumno=L Te8to* ] Kalumno*L 

    A(ora se o"serva que tam"i'n se puede e8traer la in+ormacin independientede que este sea un entero. !ado que la segunda e8traccin se (ace so"reuna varia"le del tipo int? la conversin se reali;a autom3ticamente. $ay quetener cuidado que el dato a leer sea un entero? dado que C reali;a lalectura igualmente pudi'ndose o"tener in+ormacin errnea.

    int numWstring Te8toWArc(ivoEnt Te8to numW

    alumno =Te8to ] KalumnoL num ] =L 

    todos de lectura escritura

    Como dijimos anteriormente? la lectura y escritura de datos tam"i'n sepuede reali;ar mediante llamadas a m'todos de la clase. Oeamos cuales son,

    get- y getli$e-&

    Estos m'todos permiten reali;ar la lectura de toda una lnea? (asta queencuentra un caracter de terminacin.

    Reci"en tres par3metros. El primero es un puntero a un vector de caracteres0"u++er1? el segundo el tamaMo del vector? y el tercero 0opcional1 el caracterde terminacin. or de+ecto este caracter es el KnL? llamado caracter de +inde lnea.

    Si el primer caracter de la lnea es el car3cter de terminacin? devuelven unvector de longitud cero. ero su gran di+erencia radica? en que el m'todoget01 se detiene? y una segunda llamada al m'todo devuelve el mismo

    resultado? (asta que se cam"ie el caracter de terminacin. En cam"io? unasegunda llamada al m'todo getline01 devuelve la siguiente lnea? por lo quenormalmente se utili;a este m'todo.

    6tra di+erencia radica en que el m'todo get01 puede ser llamado sin ningNnpar3metro. En este caso devuelve el caracter siguiente.

    Universidad Surcolom"iana   43de48

  • 8/18/2019 archivos- fundamentos

    44/48

    Ing Yamil Armando Cerquera [email protected]

    ara aclarar un poco el tema? se notan algunos ejemplos,

    C%digo eem!loArc)i*o e$trada

    Arc)i*o salida

    En este primer ejemplo vemos una simple lectura de una cadena decaracteres de un arc(ivo llamado entrada.t8t y su escritura en el arc(ivosalida.t8t.

    c(ar "u++Z=>[Wi+stream Arc(iEnt0Qentrada.t8tQ1Wo+stream Arc(iSal0Qsalida.t8tQ1WArc(iEnt.getline0"u++? =>1WArc(iSal HH "u++ HH endlW

    alumno

    alumno

    A(ora la di+erencia de leer el te8to de una lnea que posee m3s caracteresque los que pedimos leer. Oeremos la di+erencia de la implementacin con la+uncin get01 y con getline01.

    c(ar "u++Z=>[Wi+stream Arc(iEnt0Qentrada.t8tQ1Wo+stream Arc(iSal0Qsalida.t8tQ1WArc(iEnt.getline0"u++? =>1WArc(iSal HH "u++ HH endlW

    Arc(iEnt.getline0"u++? =>1WArc(iSal HH "u++ HH endlW

    Alumno que no piensano aprue"a

    Alumno guAlumno gu

    c(ar "u++Z=>[Wi+stream Arc(iEnt0Qentrada.t8tQ1Wo+stream Arc(iSal0Qsalida.t8tQ1WArc(iEnt.get0"u++? =>1WArc(iSal HH "u++ HH endlWArc(iEnt.get0"u++? =>1WArc(iSal HH "u++ HH endlW

    Alumno que no piensano aprue"a

    Alumno que no pien

    A(ora vemos que pasa cuando se tiene una lnea vaca. Aclaramos que en lasalida del segundo ejemplo? (ay dos lneas vacas.

    c(ar "u++Z=>[Wi+stream Arc(iEnt0Qentrada.t8tQ1Wo+stream Arc(iSal0Qsalida.t8tQ1W

    Alumnono aprue"aAlumno

    Universidad Surcolom"iana   44de48

  • 8/18/2019 archivos- fundamentos

    45/48

    Ing Yamil Armando Cerquera [email protected]

    +or 0int i]=W iH]2W i1X Arc(iEnt.get0"u++? =>1WArc(iSal HH "u++ HH endlW

    no aprue"

    c(ar "u++Z=>[Wi+stream Arc(iEnt0Qentrada.t8tQ1Wo+stream Arc(iSal0Qsalida.t8tQ1W+or 0int i]=W iH]2W i1X Arc(iEnt.get0"u++? =>1WArc(iSal HH "u++ HH endlW

    Alumnono aprue"a

    Alumno

    A(ora se ver3 como se (ace si quiere leer una lnea y asign3rseladirectamente a una varia"le del tipo string? no es tan simple como parece.ara resolver el pro"lema se (ace uso de tres +unciones de la clase string. /a+uncin "egin01 que devuelve un puntero al primer caracter de la cadena.ara especi+icar la cantidad de caracteres a leer se puode colocarsimplemente un nNmero que lo indica? si se sa"e que las lneas del arc(ivono superan ese valor? o usar la +uncin ma8Vsi;e01 que devuelve la m38imacantidad de caracteres que soporta la clase stringW a este valor (ay quedividirlo por *? dado que es el do"le que el m38imo valor del entero 0int1 quepide como par3metro la +uncin. or Nltimo? (ay que utili;ar la +uncincVstr01 para que devuelva el valor de la cadena contenida.

    string Te8toWi+stream Arc(iEnt0Qentrada.t8tQ1W

    o+stream Arc(iSal0Qsalida.t8tQ1WArc(iEnt.getline0Te8to."egin01?Te8to.ma8Vsi;e01G*1WArc(iSal HH Te8to.cVstr01 HH endlW

    Alumno que no piensa

    Alumno que no piensa

    $ay que destacar que el m'todo getline? escri"e directamente en una porcinde memoria del string? que contiene la cadena cVstring sin modi+icar ningunade las propiedades de la clase string. Es por ello? que al querer escri"ir en unarc(ivo se de"e especi+icar que se desea escri"ir el contenido cVstr01 delstring? dado que si quiero escri"ir directamente el string? como no semodi+icaron sus propiedades? la longitud de la cadena es cero? y por lo tanto KvirtualmenteL la cadena esta vaca.

    Una +orma de +or;ar a que se actualicen las propiedades del string? esreali;ar una asignacin de su propio contenido,

    string Te8toW Alumno que no piensa

    Universidad Surcolom"iana   45de48

  • 8/18/2019 archivos- fundamentos

    46/48

    Ing Yamil Armando Cerquera [email protected]

    i+stream Arc(iEnt0Qentrada.t8tQ1Wo+stream Arc(iSal0Qsalida.t8tQ1WArc(iEnt.getline0Te8to."egin01?Te8to.ma8Vsi;e01G*1W

    Te8to ] Te8to.cVstr01WArc(iSal HH Te8to HH endlW

    Alumno que no piensa

    /a verdad es que parece un poco complejo? y poco recomenda"le leer unasimple lnea de longitud indeterminada con el m'todo anterior.

    or suerte? e8iste una +uncin llamada getline01 que reali;a esteprocedimiento de +orma m3s simple. Remarcamos que es una +uncin y noun m'todo como el que vimos antes. Esta +uncin reci"e un primerpar3metro que es un i+string? el segundo es un string? y opcionalmentepuede reci"ir un tercer par3metro que es el car3cter de terminacin.

    Esta +uncin esta especialmente diseMada para leer string? por lo que no esnecesario especi+icar el largo de la cadena.

    string Te8toWi+stream Arc(iEnt0Qentrada.t8tQ1Wo+stream Arc(iSal0Qsalida.t8tQ1Wgetline0Arc(iEnt? Te8to1WArc(iSal HH Te8to HH endlW

    Alumno que no piensa

    Alumno que no piensa

    todos es!eciales

    eo,-

    Es uno de los m'todos m3s importantes. !evuelve true si se lleg al +inal dearc(ivo. Encontr el car3cter E6- 0End 6+ -ile1.

    is:o!e$-

    Este m'todo devuelve true si se a"ri correctamente el arc(ivo.

    good-

    Este m'todo devuelve true si no ocurri ningNn error.

    (ad-

    Universidad Surcolom"iana   46de48

  • 8/18/2019 archivos- fundamentos

    47/48

    Ing Yamil Armando Cerquera [email protected]

    Este m'todo devuelve true si ocurri algNn error con el "u++er.

    ,ail-

    Este m'todo devuelve true si ocurri algNn error que no a+ecte al "u++er.Eem!lo >>

    Implementar una +uncin que lea un arc(ivo de te8to llamado K!atos.t8tL?que contiene un nNmero indeterminado de nNmeros ordenados en columna?y devuelva su promedio.

    ara resolverlo de"emos reali;ar un ciclo que lea lnea por lnea cada uno delos nNmeros? los vaya sumando y contando la cantidad de datos ledos? y porNltimo calcule e in+orme el resultado.

    +loat romedio!atos01X +loat 8? suma ] >W  int cont ] >W  i+stream Arc(ivo0K!atos.t8tL1W  B(ile 0^Arc(ivo.eo+011  X Arc(ivo 8W  suma ] 8W  contW    return sumaGcontW

    Eem!lo >5

    Implementar una +uncin que lea un arc(ivo de te8to llamado K/ineas.t8tL?que contiene un nNmero indeterminado de renglones? que contiene +rases? ydevuelva la cantidad lneas que contienen la pala"ra KcasaL.

    ara resolverlo de"emos reali;ar un ciclo que lea lnea por lnea cada uno delos renglones? "usque la pala"ra KcasaL y los cuente? y por Nltimo in+orme elresultado.

    +loat CantidadCasas01X int cont ] >W  string sW  AnsiString /ineaW  i+stream Arc(ivo0K/ineas.t8tL1W  B(ile 0getline0Arc(ivo? s11  X /inea ] s.cVstr01W  i+ 0/inea.os0KcasaL1 contW

    Universidad Surcolom"iana   47de48

  • 8/18/2019 archivos- fundamentos

    48/48

    Ing Yamil Armando Cerquera [email protected]

        return contW

    EFEGLO 3W