C - E / S de archivos

El último capítulo explicó los dispositivos de entrada y salida estándar que maneja el lenguaje de programación C. Este capítulo cubre cómo los programadores de C pueden crear, abrir, cerrar archivos de texto o binarios para su almacenamiento de datos.

Un archivo representa una secuencia de bytes, independientemente de que sea un archivo de texto o un archivo binario. El lenguaje de programación C proporciona acceso a funciones de alto nivel, así como llamadas de bajo nivel (nivel de SO) para manejar archivos en sus dispositivos de almacenamiento. Este capítulo lo llevará a través de las llamadas importantes para la administración de archivos.

Abrir archivos

Puedes usar el fopen( )función para crear un nuevo archivo o para abrir un archivo existente. Esta llamada inicializará un objeto del tipoFILE, que contiene toda la información necesaria para controlar la transmisión. El prototipo de esta llamada de función es el siguiente:

FILE *fopen( const char * filename, const char * mode );

Aquí, filename es un literal de cadena, que usará para nombrar su archivo y acceder mode puede tener uno de los siguientes valores:

No Señor. Modo y descripción
1

r

Abre un archivo de texto existente con fines de lectura.

2

w

Abre un archivo de texto para escribir. Si no existe, se crea un nuevo archivo. Aquí su programa comenzará a escribir contenido desde el principio del archivo.

3

a

Abre un archivo de texto para escribir en modo adjunto. Si no existe, se crea un nuevo archivo. Aquí su programa comenzará a agregar contenido en el contenido del archivo existente.

4

r+

Abre un archivo de texto para leer y escribir.

5

w+

Abre un archivo de texto para leer y escribir. Primero trunca el archivo a una longitud cero si existe; de ​​lo contrario, crea un archivo si no existe.

6

a+

Abre un archivo de texto para leer y escribir. Crea el archivo si no existe. La lectura comenzará desde el principio, pero la escritura solo se puede agregar.

Si va a manejar archivos binarios, utilizará los siguientes modos de acceso en lugar de los mencionados anteriormente:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

Cerrar un archivo

Para cerrar un archivo, use la función fclose (). El prototipo de esta función es:

int fclose( FILE *fp );

los fclose(-) la función devuelve cero en caso de éxito, o EOFsi hay un error al cerrar el archivo. Esta función en realidad vacía cualquier dato aún pendiente en el búfer al archivo, cierra el archivo y libera la memoria utilizada para el archivo. El EOF es una constante definida en el archivo de encabezadostdio.h.

Hay varias funciones proporcionadas por la biblioteca estándar de C para leer y escribir un archivo, carácter por carácter o en forma de una cadena de longitud fija.

Escribir un archivo

A continuación se muestra la función más simple para escribir caracteres individuales en una secuencia:

int fputc( int c, FILE *fp );

La función fputc()escribe el valor de carácter del argumento c en el flujo de salida al que hace referencia fp. Devuelve el carácter escrito escrito en el éxito de lo contrarioEOFsi hay un error. Puede utilizar las siguientes funciones para escribir una cadena terminada en nulo en una secuencia:

int fputs( const char *s, FILE *fp );

La función fputs() escribe la cadena sal flujo de salida referenciado por fp. Devuelve un valor no negativo en caso de éxito, de lo contrarioEOFse devuelve en caso de cualquier error. Puedes usarint fprintf(FILE *fp,const char *format, ...)también funciona para escribir una cadena en un archivo. Pruebe el siguiente ejemplo.

Asegúrate de tener /tmpdirectorio disponible. Si no es así, antes de continuar, debe crear este directorio en su máquina.

#include <stdio.h>

main() {
   FILE *fp;

   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);
}

Cuando se compila y ejecuta el código anterior, crea un nuevo archivo test.txten el directorio / tmp y escribe dos líneas usando dos funciones diferentes. Leamos este archivo en la siguiente sección.

Leer un archivo

A continuación se muestra la función más simple para leer un solo carácter de un archivo:

int fgetc( FILE * fp );

los fgetc()La función lee un carácter del archivo de entrada al que hace referencia fp. El valor de retorno es el carácter leído, o en caso de error, devuelveEOF. La siguiente función permite leer una cadena de una secuencia:

char *fgets( char *buf, int n, FILE *fp );

Las funciones fgets()lee hasta n-1 caracteres del flujo de entrada al que hace referencia fp. Copia la cadena de lectura en el búferbuf, agregando un null carácter para terminar la cadena.

Si esta función encuentra un carácter de nueva línea '\ n' o el final del archivo EOF antes de que hayan leído el número máximo de caracteres, entonces devuelve solo los caracteres leídos hasta ese punto, incluido el carácter de nueva línea. También puedes usarint fscanf(FILE *fp, const char *format, ...) función para leer cadenas de un archivo, pero deja de leer después de encontrar el primer carácter de espacio.

#include <stdio.h>

main() {

   FILE *fp;
   char buff[255];

   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1 : %s\n", buff );

   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );
   
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);

}

Cuando se compila y ejecuta el código anterior, lee el archivo creado en la sección anterior y produce el siguiente resultado:

1 : This
2: is testing for fprintf...

3: This is testing for fputs...

Veamos un poco más en detalle lo que pasó aquí. Primero,fscanf() leer solo This porque después de eso, encontró un espacio, la segunda llamada es para fgets()que lee la línea restante hasta que encuentra el final de la línea. Finalmente, la última llamadafgets() lee la segunda línea por completo.

Funciones de E / S binarias

Hay dos funciones que se pueden utilizar para entrada y salida binarias:

size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
              
size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);

Ambas funciones deben usarse para leer o escribir bloques de memorias, generalmente matrices o estructuras.