Herramientas de usuario

Herramientas del sitio


archivos

¡Esta es una revisión vieja del documento!


Archivos

Todas la funciones de acceso a archivos requieren incluir:

#include <stdio.h>

Para operar con archivos se requiere declarar un puntero a un descriptor de archivo:

FILE *in, *out;  /* file pointer */

Antes de leer o escribir hay que abrir el archivo. La excepción corresponde a la entrada estándar, salida estándar y salida estándar de errores que ya están abiertos.

in= fopen(nombre, "r"); /* "r" por read */
out= fopen(nombre, "w"); /* "w" por write o "a" por append */
/* fopen retorna NULL en caso de error */

Después de leer o escribir se debe cerrar el archivo para liberar recursos y para asegurar que se escriba todo el contenido de un archivo de salida. De lo contrario, algunos bytes podrían permanecer en buffers internos.

fclose(out);

Leer/escribir de a un caracter:

c= getc(in);
putc(c, out);

Devolver un caracter leído, para que se vuelva a leer.

ungetc(c, in);

También se puede usar getchar y putchar para leer/escribir de la entrada/salida estándar. Pero estas son en realidad macros que recurren a getc/putc.

#define getchar()   getc(stdin)
#define putchar(c)  putc((c), stdout)

Entrada/salida con formato:

fprintf(fp, formato, ...);
fscanf(fp, formato, ...);

Lectura/escritura de bloques de bytes:

char buf[80];
ssize_t leidos= fread(buf, 80, 1, in);
ssize_t escritos= fwrite(buf, 80, 1, out);

Determinar si se llegó al final del archivo:

if (feof(in))
  ...

Determinar si ocurrió algún error de lectura/escritura:

if (ferror(out))
  ...

Ejemplo: copia de archivos

El siguiente programa copia un archivo:

  #include <stdio.h>
  #include <stdlib.h>
        
  void filecopy(FILE *in, FILE *out) {
    char buf[1024];
    size_t size;
        
    while (!feof(in)) {
      size_t size= fread(buf, 1024, 1, in);
      if (ferror(in)) {
        fprintf(stderr, "Error de lectura\n");
        exit(1);
      }
      if (fwrite(buf, size, 1, out)!=size) {
        fprintf(stderr, "Error de escritura\n");
        exit(1);
      }
    }
  }
  
  main(int argc, char *argv[]) {
    FILE *in, *out;
    
    if(argc!=3) {
      fprintf(stderr, "uso: %s <arch. fuente> <arch. destino>\n", argv[0]);
      exit(1);
    }
    else {
      if ((in= fopen(argv[1], "r"))==NULL) {
        fprintf(stderr, "No se puede leer '%s'\n", argv[1]);
        exit(1);
      }
      if ((out= fopen(argv[2], "w"))==NULL) { 
        fprintf(stderr, "No se puede escribir '%s'\n", argv[2]);
        exit(2);
      }
      filecopy(in, out);
      fclose(in);
      fclose(out);
    }
  }
archivos.1345687844.txt.gz · Última modificación: 2012/08/23 02:10 por lmateu