Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

Manejo de archivos C

Manejo de archivos C

En este tutorial, aprenderá sobre el manejo de archivos en C. Aprenderá a manejar E/S estándar en C usando fprintf(), fscanf(), fread(), fwrite(), fseek() etc. con la ayuda de ejemplos.

Un archivo es un contenedor en dispositivos de almacenamiento informático que se utiliza para almacenar datos.


¿Por qué se necesitan archivos?


Tipos de archivos

Cuando se trata de archivos, hay dos tipos de archivos que debe conocer:

  1. Archivos de texto
  2. Archivos binarios

1. Archivos de texto

Los archivos de texto son los .txt normales. archivos Puede crear fácilmente archivos de texto utilizando cualquier editor de texto simple como el Bloc de notas.

Cuando abra esos archivos, verá todo el contenido del archivo como texto sin formato. Puede editar o eliminar fácilmente los contenidos.

Requieren un mínimo esfuerzo de mantenimiento, son fáciles de leer y brindan la menor seguridad y ocupan más espacio de almacenamiento.

2. Archivos binarios

Los archivos binarios son en su mayoría .bin archivos en su computadora.

En lugar de almacenar datos en texto sin formato, los almacenan en forma binaria (0 y 1).

Pueden contener una mayor cantidad de datos, no se pueden leer fácilmente y brindan mayor seguridad que los archivos de texto.


Operaciones de archivos

En C, puede realizar cuatro operaciones principales en archivos, ya sean de texto o binarios:

  1. Crear un archivo nuevo
  2. Abrir un archivo existente
  3. Cerrar un archivo
  4. Leer y escribir información en un archivo

Trabajar con archivos

Cuando trabaje con archivos, debe declarar un puntero de tipo archivo. Esta declaración es necesaria para la comunicación entre el archivo y el programa.

FILE *fptr;

Abrir un archivo - para crear y editar

La apertura de un archivo se realiza utilizando el fopen() función definida en el stdio.h archivo de encabezado.

La sintaxis para abrir un archivo en E/S estándar es:

ptr = fopen("fileopen","mode");

Por ejemplo,

fopen("E:\\cprogram\\newprogram.txt","w");

fopen("E:\\cprogram\\oldprogram.bin","rb");
Modos de apertura en E/S estándar
Modo Significado del modo Durante la inexistencia del archivo
r Abierto para lectura. Si el archivo no existe, fopen() devuelve NULL.
rb Abierto para lectura en modo binario. Si el archivo no existe, fopen() devuelve NULL.
w Abierto para escribir. Si el archivo existe, su contenido se sobrescribe.
Si el archivo no existe, se creará.
wb Abierto para escritura en modo binario. Si el archivo existe, su contenido se sobrescribe.
Si el archivo no existe, se creará.
a Abrir para agregar.
Los datos se agregan al final del archivo.
Si el archivo no existe, se creará.
ab Abrir para agregar en modo binario.
Los datos se agregan al final del archivo.
Si el archivo no existe, se creará.
r+ Abierto tanto para lectura como para escritura. Si el archivo no existe, fopen() devuelve NULL.
rb+ Abierto para lectura y escritura en modo binario. Si el archivo no existe, fopen() devuelve NULL.
w+ Abierto tanto para lectura como para escritura. Si el archivo existe, su contenido se sobrescribe.
Si el archivo no existe, se creará.
wb+ Abierto para lectura y escritura en modo binario. Si el archivo existe, su contenido se sobrescribe.
Si el archivo no existe, se creará.
a+ Abrir para leer y agregar. Si el archivo no existe, se creará.
ab+ Abierto para leer y agregar en modo binario. Si el archivo no existe, se creará.

Cerrar un archivo

El archivo (tanto de texto como binario) debe cerrarse después de leer/escribir.

El cierre de un archivo se realiza usando el fclose() función.

fclose(fptr);

Aquí, fptr es un puntero de archivo asociado con el archivo que se cerrará.


Leer y escribir en un archivo de texto

Para leer y escribir en un archivo de texto, usamos las funciones fprintf() y fscanf().

Son solo las versiones de archivo de printf() y scanf() . La única diferencia es que fprintf() y fscanf() espera un puntero a la estructura ARCHIVO.


Ejemplo 1:escribir en un archivo de texto

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int num;
   FILE *fptr;

   // use appropriate location if you are using MacOS or Linux
   fptr = fopen("C:\\program.txt","w");

   if(fptr == NULL)
   {
      printf("Error!");   
      exit(1);             
   }

   printf("Enter num: ");
   scanf("%d",&num);

   fprintf(fptr,"%d",num);
   fclose(fptr);

   return 0;
}

Este programa toma un número del usuario y lo almacena en el archivo program.txt .

Después de compilar y ejecutar este programa, puede ver un archivo de texto program.txt creado en la unidad C de su computadora. Cuando abre el archivo, puede ver el número entero que ingresó.


Ejemplo 2:Leer desde un archivo de texto

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int num;
   FILE *fptr;

   if ((fptr = fopen("C:\\program.txt","r")) == NULL){
       printf("Error! opening file");

       // Program exits if the file pointer returns NULL.
       exit(1);
   }

   fscanf(fptr,"%d", &num);

   printf("Value of n=%d", num);
   fclose(fptr); 
  
   return 0;
}

Este programa lee el entero presente en el program.txt archivo y lo imprime en la pantalla.

Si creó correctamente el archivo a partir del Ejemplo 1 , al ejecutar este programa obtendrá el número entero que ingresó.

Otras funciones como fgetchar() , fputc() etc. se pueden usar de manera similar.


Leer y escribir en un archivo binario

Funciones fread() y fwrite() se utilizan para leer y escribir en un archivo en el disco respectivamente en el caso de archivos binarios.


Escribir en un archivo binario

Para escribir en un archivo binario, debe usar el fwrite() función. Las funciones toman cuatro argumentos:

  1. dirección de datos a escribir en el disco
  2. tamaño de los datos que se escribirán en el disco
  3. número de este tipo de datos
  4. puntero al archivo donde desea escribir.
fwrite(addressData, sizeData, numbersData, pointerToFile);

Ejemplo 3:Escribir en un archivo binario usando fwrite()

#include <stdio.h>
#include <stdlib.h>

struct threeNum
{
   int n1, n2, n3;
};

int main()
{
   int n;
   struct threeNum num;
   FILE *fptr;

   if ((fptr = fopen("C:\\program.bin","wb")) == NULL){
       printf("Error! opening file");

       // Program exits if the file pointer returns NULL.
       exit(1);
   }

   for(n = 1; n < 5; ++n)
   {
      num.n1 = n;
      num.n2 = 5*n;
      num.n3 = 5*n + 1;
      fwrite(&num, sizeof(struct threeNum), 1, fptr); 
   }
   fclose(fptr); 
  
   return 0;
}

En este programa, creamos un nuevo archivo program.bin en la unidad C.

Declaramos una estructura threeNum con tres números - n1, n2 y n3 , y defínalo en la función principal como num.

Ahora, dentro del ciclo for, almacenamos el valor en el archivo usando fwrite() .

El primer parámetro toma la dirección de num y el segundo parámetro toma el tamaño de la estructura threeNum .

Dado que solo estamos insertando una instancia de num , el tercer parámetro es 1 . Y, el último parámetro *fptr apunta al archivo en el que estamos almacenando los datos.

Finalmente, cerramos el archivo.


Lectura de un archivo binario

Función fread() también toma 4 argumentos similares al fwrite() funcionan como arriba.

fread(addressData, sizeData, numbersData, pointerToFile);

Ejemplo 4:Leer desde un archivo binario usando fread()

#include <stdio.h>
#include <stdlib.h>

struct threeNum
{
   int n1, n2, n3;
};

int main()
{
   int n;
   struct threeNum num;
   FILE *fptr;

   if ((fptr = fopen("C:\\program.bin","rb")) == NULL){
       printf("Error! opening file");

       // Program exits if the file pointer returns NULL.
       exit(1);
   }

   for(n = 1; n < 5; ++n)
   {
      fread(&num, sizeof(struct threeNum), 1, fptr); 
      printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
   }
   fclose(fptr); 
  
   return 0;
}

En este programa, lees el mismo archivo program.bin y recorra los registros uno por uno.

En términos simples, lees uno threeNum registro de threeNum tamaño del archivo apuntado por *fptr en la estructura num .

Obtendrá los mismos registros que insertó en Ejemplo 3 .


Obtener datos usando fseek()

Si tiene muchos registros dentro de un archivo y necesita acceder a un registro en una posición específica, debe recorrer todos los registros anteriores para obtener el registro.

Esto desperdiciará mucha memoria y tiempo de operación. Se puede lograr una forma más fácil de obtener los datos requeridos usando fseek() .

Como sugiere el nombre, fseek() busca el cursor al registro dado en el archivo.


Sintaxis de fseek()

fseek(FILE * stream, long int offset, int whence);

El primer flujo de parámetros es el puntero al archivo. El segundo parámetro es la posición del registro que se va a encontrar y el tercer parámetro especifica la ubicación donde comienza el desplazamiento.

De dónde diferente en fseek()
De dónde Significado
SEEK_SET Inicia el desplazamiento desde el principio del archivo.
SEEK_END Inicia el desplazamiento desde el final del archivo.
SEEK_CUR Inicia el desplazamiento desde la ubicación actual del cursor en el archivo.

Ejemplo 5:fseek()

#include <stdio.h>
#include <stdlib.h>

struct threeNum
{
   int n1, n2, n3;
};

int main()
{
   int n;
   struct threeNum num;
   FILE *fptr;

   if ((fptr = fopen("C:\\program.bin","rb")) == NULL){
       printf("Error! opening file");

       // Program exits if the file pointer returns NULL.
       exit(1);
   }
   
   // Moves the cursor to the end of the file
   fseek(fptr, -sizeof(struct threeNum), SEEK_END);

   for(n = 1; n < 5; ++n)
   {
      fread(&num, sizeof(struct threeNum), 1, fptr); 
      printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
      fseek(fptr, -2*sizeof(struct threeNum), SEEK_CUR);
   }
   fclose(fptr); 
  
   return 0;
}

Este programa comenzará a leer los registros del archivo program.bin en orden inverso (del último al primero) y lo imprime.


Lenguaje C

  1. Clase de archivo Java
  2. Introducción a los archivos STL
  3. Operaciones de E/S de archivos de Verilog
  4. C - E/S de archivo
  5. C - Archivos de encabezado
  6. C - Manejo de errores
  7. Archivos y flujos de C++
  8. Manejo de señales C++
  9. C# - Manejo de excepciones
  10. C# - E/S de archivos
  11. Python - E/S de archivos