Herramientas de usuario

Herramientas del sitio


archivos

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
archivos [2012/08/23 02:06] lmateuarchivos [2019/09/03 13:53] (actual) – [Ejemplo: copia de archivos] lmateu
Línea 16: Línea 16:
   /* fopen retorna NULL en caso de error */   /* fopen retorna NULL en caso de error */
  
-Despues de leer o escribir se debe cerrar el archivo para liberar recursos y para+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, asegurar que se escriba todo el contenido de un archivo de salida.  De lo contrario,
 algunos bytes podrían permanecer en buffers internos. algunos bytes podrían permanecer en buffers internos.
Línea 27: Línea 27:
 Devolver un caracter leído, para que se vuelva a leer. Devolver un caracter leído, para que se vuelva a leer.
   ungetc(c, in);   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: Entrada/salida con formato:
Línea 41: Línea 35:
 Lectura/escritura de bloques de bytes: Lectura/escritura de bloques de bytes:
   char buf[80];   char buf[80];
-  ssize_t leidos= fread(buf, 80, 1, in); +  size_t leidos= fread(buf, 1, 80, in); 
-  ssize_t escritos= fwrite(buf, 80, 1, out);+  size_t escritos= fwrite(buf, 1, 80, out);
  
 Determinar si se llegó al final del archivo: Determinar si se llegó al final del archivo:
Línea 52: Línea 46:
     ...     ...
  
-=== Ejemplo ===+Acceso directo: 
 +  fseek(in, pos, SEEKSET); 
 + 
 +Posiciona el archivo de tal forma que el próximo caracter que se leerá 
 +de in es el que encuentra en el desplazamiento pos, medido desde el comienzo 
 +del archivo. 
 + 
 +==== Entrada estándar, salida estándar y salida estándar de errores ==== 
 + 
 +Todo proceso al partir cuenta con los siguientes descriptores de archivos para leer la entrada estándar, escribir la salida estándar o escribir en la salida estándar de errores respectivamente: 
 + 
 +  FILE *stdin, *stdout, *stderr; 
 + 
 +No es necesario abrir estos archivos porque se abren automáticamente al iniciarse el proceso.  Además todos los archivos abiertos por un proceso se cierran automáticamente al terminar ese proceso. 
 + 
 +Es usual 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) 
 + 
 +Es decir una invocación a getchar() se substituye textualmente por getc(stdin). 
 +==== Ejemplo: copia de archivos ====
  
 El siguiente programa copia un archivo: El siguiente programa copia un archivo:
Línea 59: Línea 76:
   #include <stdio.h>   #include <stdio.h>
   #include <stdlib.h>   #include <stdlib.h>
-        +
   void filecopy(FILE *in, FILE *out) {   void filecopy(FILE *in, FILE *out) {
     char buf[1024];     char buf[1024];
     size_t size;     size_t size;
-         + 
-    while (!feof(in)) { +    while ((size= fread(buf, 1, 1024, in))!=0) { 
-      size_t size= fread(buf, 1024, 1, in)+      if (fwrite(buf, 1, size, out)!=size) { 
-      if (ferror(in)) { +        perror("fwrite");
-        fprintf(stderr, "Error de lectura\n"); +
-        exit(1); +
-      } +
-      if (fwrite(buf, size, 1, out)!=size) { +
-        fprintf(stderr, "Error de escritura\n");+
         exit(1);         exit(1);
       }       }
 +    }
 +    if (ferror(in)) {
 +      perror("fread");
 +      exit(1);
     }     }
   }   }
-   + 
-  main(int argc, char *argv[]) {+  int main(int argc, char *argv[]) {
     FILE *in, *out;     FILE *in, *out;
-    +
     if(argc!=3) {     if(argc!=3) {
       fprintf(stderr, "uso: %s <arch. fuente> <arch. destino>\n", argv[0]);       fprintf(stderr, "uso: %s <arch. fuente> <arch. destino>\n", argv[0]);
Línea 86: Línea 102:
     else {     else {
       if ((in= fopen(argv[1], "r"))==NULL) {       if ((in= fopen(argv[1], "r"))==NULL) {
-        fprintf(stderr, "No se puede leer '%s'\n", argv[1]);+        perror(argv[1]);
         exit(1);         exit(1);
       }       }
-      if ((out= fopen(argv[2], "w"))==NULL) {  +      if ((out= fopen(argv[2], "w"))==NULL) { 
-        fprintf(stderr, "No se puede escribir '%s'\n", argv[2]); +        perror(argv[2]); 
-        exit(2);+        exit(1);
       }       }
       filecopy(in, out);       filecopy(in, out);
Línea 97: Línea 113:
       fclose(out);       fclose(out);
     }     }
 +    return 0;
   }   }
 </code> </code>
 +
 +==== Ejercicio ====
 +
 +Estudie la [[http://users.dcc.uchile.cl/~lmateu/CC3301/download/filesort.zip|solución]] de la [[http://users.dcc.uchile.cl/~lmateu/CC3301/tareas/t2-2015-1.pdf|tarea 2 de 2015/1]].  Use el mismo enfoque de esa solución para resolver la pregunta 1 del [[http://users.dcc.uchile.cl/~lmateu/CC3301/controles/c2-151.pdf|control 2 de 2015/1]].  Pruebe su solución con el archivo [[http://users.dcc.uchile.cl/~lmateu/CC3301/download/buscar.zip|buscar.zip]].  Siga las instrucciones que se indican en el archivo Makefile.  Este ejercicio combina el uso de punteros a funciones con acceso directo a archivos por medio de fseek.
 +
archivos.1345687587.txt.gz · Última modificación: 2012/08/23 02:06 por lmateu