Saltar al contenido principal
LibreTexts Español

13.1: Introducción

  • Page ID
    82342
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    Fileio de alto nivel en C utiliza funciones como fopen (), fclose (), fread (), fwrite, fprintf (), fgetc (), y así sucesivamente. Estos utilizan una variable de tipo FILE para acceder a los archivos de disco. Permiten leer y escribir datos desde/a archivos en disco de una manera muy similar a enviar datos a la pantalla de la computadora a través de printf () o recuperar datos del teclado a través de scanf ().

    Más cerca de casa, tenemos fileio de bajo nivel. Estos usan un descriptor de archivo, que básicamente es solo un entero. Las funciones de alto nivel realmente llaman a las funciones de bajo nivel de todos modos. Hay cinco cosas que debes hacer con los archivos. Primero, los abres para obtener acceso a un archivo existente o para crear uno nuevo. A continuación, lee o escribe datos desde/hacia el archivo. También es posible que tengas que moverte en un archivo, tal vez para releer datos o saltarte los datos. Por último, cuando termines de usar el archivo, debes cerrarlo. Para abrir un archivo use:

    fh = open( name, mode );
    

    donde

    char *name: /* disk name of file */
    int fh:     /* file descriptor */
    int mode;   /* a define */
    

    fh es el descriptor de archivo que se necesita para posteriores llamadas de lectura/escritura. Será >= O si todo está bien, -1 en caso de error.

    Modos de ejemplo:

    O_RDONLY

    solo lectura

    _WRONLY

    escribir solo

    O_CREAT

    crear si no existe

    Para leer/escribir datos, utilice:

    count = read( fh, buffer, len );
    count = write( fh, buffer, len );
    

    fh es el descriptor de archivo devuelto por open (), buffer es la dirección de donde encontrar/colocar los datos (es decir, lo que estás copiando al disco o haciendo una copia desde el disco), len es el número de bytes a leer/escribir, count es el número real de bytes de lectura/escritura.

    Un constructo común es:

    if( (count = read( fh, buf, len )) != len )
    {
        //...there was an error, process it...
    }
    

    También puedes saltarte en un archivo:

    apos = lseek( fh, rpos, mode );
    

    donde

    apos largos

    posición absoluta (-1 en caso de error)

    rpos largos

    posición relativa

    modo

    0 para relativo al inicio del archivo (rpos >= 0)

    1 para posición relativa a la actual

    2 para relativo al final (rpos <= 0)

    Tenga en cuenta que su posición actual es = lseek (fh, O, 1);

    Cuando haya terminado con el expediente, deberá cerrarlo:

    error = close( fh );
    

    el error es O si todo salió bien, -1 de lo contrario.

    C le permite tener múltiples archivos abiertos simultáneamente para leer y escribir. Necesitará un descriptor de archivo por cada archivo abierto al mismo tiempo (se pueden reutilizar posteriormente, si se desea).

    A continuación se muestra un programa que puede ser utilizado para investigar el contenido de casi cualquier tipo de archivo. Utiliza una variedad de técnicas que hemos examinado a lo largo del curso. Algunas líneas han envuelto.

    /* headdump.c
       This program spits out the first 128 bytes of a file in hex, decimal, and
       string form (non printable chars are printed out as periods). */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    #define CHUNKSIZE 128
    
    unsigned char buf[CHUNKSIZE];
    
    char *szerrmsgs[] = {
        "No errors on %s\n",
        "USAGE: %s <filename>\n",
        "Could not open %s\n",
        "Seek error on %s\n",
        "Position error on %s\n",
        "Rewind error on %s\n",
        "Read error on %s\n"
        };
    
    void my_exit( FILE *fp, int err, char *pc )
    {
       if( fp )    fclose( fp );
       if( err )   printf( szerrmsgs[err], pc ); /* don't bother if all OK */
       exit( err );
    }
    
    void main( int argc, char *argv[] )
    {
        int size, c=0, x;
        FILE *fp=0;
        
        if( (argc < 2) || ( !strcmp(argv[1], "?") ) )
            my_exit( fp, 1, argv[0] );
    
        if( fp = fopen( argv[1], "r" ) )
        {
            /* Find out how big the file is. If it's < CHUNKSIZE then read in what's available */
            if( -1 != fseek( fp, 0, 2 ) ) /* seek to end */
            {
                if( -1 != (size = ftell( fp )) )
                {
                    if( size > CHUNKSIZE ) size = CHUNKSIZE;
                    if( -1 != fseek( fp, 0, 0 ) ) /* seek to start */
                    {
                        if( fread( buf, 1, size, fp ) == (unsigned int)size )
                        {
                            /* print this out as 8 chars by 16 (or so) lines, first hex,
                             then decimal, then string */
                            while( c < size )
                            {
                                /* print out line as hex */
                                printf("%3d: %02x%02x %02x%02x %02x%02x %02x%02x ",
                                c,buf[c],buf[c+1],buf[c+2],buf[c+3],buf[c+4],buf[c+5],buf[c+6],buf[c+7] );
                            
                                /* print out line as decimal */
                                printf(" %03d%03d %03d%03d %03d%03d %03d%03d ",
                                buf[c],buf[c+1],buf[c+2],buf[c+3],buf[c+4],buf[c+5],buf[c+6],buf[c+7] );
    
                                /* print out line as string. check the chars and if not
                                    printable, replace with periods */
                                for( x=0; x<8; x++ )
                                {
                                    if( !isprint( buf[c+x] ) )
                                        buf[c+x] = '.';
                                }
                                printf(" %c%c%c%c%c%c%c%c\n",buf[c],buf[c+1],buf[c+2],
                                buf[c+3],buf[c+4],buf[c+5],buf[c+6], buf[c+7] );
    
                                c+=8;
                            }
                        }
                        else
                            my_exit( fp, 6, argv[0] );
                    }
                    else
                        my_exit( fp, 5, argv[0] );
                }
                else
                    my_exit( fp, 4, argv[0] );
            }
            else
                my_exit( fp, 3, argv[0] );
        }
        else
            my_exit( fp, 2, argv[1] );
        my_exit( fp, 0, argv[1] );
    }
    

    This page titled 13.1: Introducción is shared under a CC BY-NC-SA 4.0 license and was authored, remixed, and/or curated by James M. Fiore via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.