English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial Básico de C

Control de flujo de C

Funciones en C

Arreglos en C

Punteros en C

Cadenas en C

Estructuras de C

Archivos de C

C Otros

Manual de Referencia de C

Escribir y leer archivos en C

En este tutorial, aprenderás a manejar archivos en el lenguaje de programación C. Aprenderás a usar fprintf(), fscanf(), fread(), fwrite(), fseek() y otros para manejar archivos estándar en C a través de ejemplos./O。

Los archivos son contenedores utilizados en dispositivos de almacenamiento de computadoras para almacenar datos.

¿Por qué se necesitan archivos?

  • Cuando el programa finaliza, todos los datos se perderán. A pesar de que el programa finaliza, los datos almacenados en el archivo se mantendrán.

  • Si debes ingresar una gran cantidad de datos, se tardará mucho tiempo en ingresar todos.
    Pero, si tienes un archivo que contiene todos los datos, puedes acceder fácilmente al contenido del archivo utilizando algunos comandos en C.

  • Puedes mover datos de una computadora a otra sin需要进行任何 cambio.

tipos de archivo

Al procesar archivos, debes entender dos tipos de archivos:

  1. archivos de texto

  2. archivos binarios

1.archivos de texto

Los archivos de texto son.txtarchivos. Puedes crear archivos de texto fácilmente con cualquier editor de texto simple (por ejemplo, Bloc de notas).

Al abrir estos archivos, verás todo el contenido del archivo en formato de texto puro. Puedes editar o eliminar el contenido fácilmente.

Ofrecen la menor cantidad de mantenimiento, son fáciles de leer, proporcionan la menor seguridad y ocupan más espacio de almacenamiento.

2.archivos binarios

Los archivos binarios son principalmente.binarchivo.

No almacenan datos en formato de texto puro, sino en formato binario (0 y1almacenar datos.

En comparación con los archivos de texto, pueden contener más datos, son difíciles de leer y ofrecen una mejor seguridad.

operaciones de archivo

En C, puedes realizar cuatro operaciones principales con los archivos:

  1. crear un archivo nuevo

  2. abrir un archivo existente

  3. Cierre de archivo

  4. leer información y escribirla en el archivo

procesar archivos

Al procesar archivos, es necesario declarar un puntero de tipo de 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

Se utiliza la función fopen() definida en el archivo de cabecera stdio.h para abrir un archivo.

en I / La sintaxis para abrir un archivo en O es:

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

Por ejemplo,

fopen("E:\\cprogram\\newprogram.txt","w");
fopen("E:\\cprogram\\oldprogram.bin","rb");
  • Supongamos que el archivo newprogram.txt no existe en la ruta E:\cprogram. La primera función crea un nuevo archivo llamado newprogram.txt y según'w'El modo de apertura abre el archivo para escribir.
    El modo de escritura permite crear y editar (sobrescribir) el contenido del archivo.

  • Ahora, supongamos que el segundo archivo binario oldprogram.bin existe en la ruta E:\cprogram. La segunda función abre el archivo existente, en modo binario'rb'Lectura.
    El modo de lectura solo permite leer el archivo y no escribir en él.

I estándar / Los modos de apertura en O
ModoSignificado del mododurante el tiempo en que el archivo no existe
rCon soloLecturaModoAbrir.

Si el archivo no existe, fopen() devolverá NULL.

rb

Abrir para leer en modo binario.

Si el archivo no existe, fopen() devolverá NULL.
wAbrir archivo de texto que permite escribir en el archivo.

Abrir un archivo de texto que permite escribir en el archivo. Si el archivo no existe, se creará un nuevo archivo.

Aquí, su programa escribirá contenido desde el principio del archivo.

Si el archivo existe, se truncará a longitud cero y se escribirá de nuevo.

wb

Abrir el archivo para escribir en modo binario.

Si el archivo existe, su contenido se sobrescribirá.
Si el archivo no existe, se creará.
aAbrir 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+Abrir para lectura y escritura.

Si el archivo no existe, fopen() devolverá NULL.

rb+

Abrir para leer y escribir en modo binario.

Si el archivo no existe, fopen() devolverá NULL.
w+Abrir un archivo de texto que permite la lectura y escritura del archivo

Si el archivo existe, su contenido se sobrescribirá.

Si el archivo no existe, se creará.

wb+

Abrir para leer y escribir en modo binario.

Si el archivo existe, su contenido se sobrescribirá.
Si el archivo no existe, se creará.
a+Abrir para leer y agregar.

Si el archivo no existe, se creará.

ab+

Abrir para leer y agregar en modo binario.

Si el archivo no existe, se creará.

Cierre de archivo

Lectura/Después de escribir, debe cerrar el archivo (archivo de texto y archivo binario).

Se puede cerrar el archivo utilizando la función fclose().

fclose(fptr);

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

Lectura y escritura de archivos de texto

Para leer y escribir archivos de texto, utilizamos las funciones fprintf() y fscanf().

Son versiones de archivo de printf() y scanf(). La única diferencia es que fprint() y fscanf() necesitan un puntero a la estructura FILE.

Ejemplo1:escribir archivo de texto

#include <stdio.h>
#include <stdlib.h>
int main()
{
   int num;
   FILE *fptr;
   // Si utiliza MacOS o Linux, utilice la ruta correcta
   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 obtiene un número del usuario y lo almacena en el archivo program.txt.

Después de compilar y ejecutar este programa, puede ver el archivo de texto program.txt creado en la unidad C del ordenador. Al abrir el archivo, puede ver el entero de entrada.

Ejemplo2Leer desde el 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! No se pudo abrir el archivo");
       //Si el puntero de archivo devuelve NULL, el programa se cierra.
       exit(1);
   }
   fscanf(fptr,"%d", &num);
   printf("Value of n=%d", num);
   fclose(fptr); 
  
   return 0;
}

El programa lee el entero existente en el archivo program.txt y lo imprime en la pantalla.

Si leeEjemplo1Se ha creado el archivo con éxito, ejecutar este programa le proporcionará el entero de entrada.

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

Lectura y escritura de archivos binarios

En el caso de archivos binarios, las funciones fread() y fwrite() se utilizan respectivamente para leer y escribir en el archivo en el disco.

Escribir en el archivo binario

Para escribir en un archivo binario, se debe usar la función fwrite(). Estas funciones admiten cuatro parámetros:

  1. La dirección de los datos que se escribirán en el disco

  2. El tamaño de los datos que se escribirán en el disco

  3. La cantidad de datos de este tipo

  4. El puntero al archivo donde se escribe.

fwrite(addressData, sizeData, numbersData, pointerToFile);

Ejemplo3Usar fwrite() para escribir en el archivo binario

#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! No se pudo abrir el archivo");
       // Si el puntero de archivo devuelve NULL, el programa se cierra.
       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 un número n con tres dígitos1, n2y n3La estructura threeNum, y la definimos en la función principal como num.

Ahora, en el bucle for, usamos fwrite() para almacenar los valores en el archivo.

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

Dado que solo insertamos una instancia de num, el tercer parámetro es1El último parámetro* fptr apunta al archivo donde almacenaremos los datos.

Finalmente, cerramos el archivo.

Leer desde el archivo binario

La función fread() también usa un formato similar al de la función fwrite() anterior.4parámetros.

fread(addressData, sizeData, numbersData, pointerToFile);

Ejemplo4: Leer desde el 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! No se pudo abrir el archivo");
       //Si el puntero de archivo devuelve NULL, el programa se cierra.
       exit(1);
   }
   for(n = 1; n < 5; ++n)
   {
      fread(&num, sizeof(struct threeNum), 1, fptr); 
      printf("\n"1: %d\t
2: %d\t
3: %d", num.n1, num.n2, num.n3);
   }
   fclose(fptr); 
  
   return 0;
}

En este programa, se lee el mismo archivo program.bin y se navega por los registros uno por uno.

En resumen, leerá desde* Leer un threeNum de tamaño threeNum desde el archivo al que apunta fptr*Copiar el registro num al struct num.

Obtendrá lo mismo queEjemplo3中Insertar registros con los mismos registros.

Obtener datos usando fseek()

Si hay muchos registros en el archivo y se necesita acceder a un registro específico, se debe recorrer todos los registros para obtener el registro.

Esto puede desperdiciar una gran cantidad de memoria y tiempo de operación. Se puede obtener los datos necesarios fácilmente usando fseek().

Como su nombre indica, fseek() coloca el cursor en el registro dado en el archivo.

Sintaxis de fseek()

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

El primer parámetro flujo es un puntero a un archivo. El segundo parámetro es la posición del registro que se desea encontrar, y el tercero especifica la posición de inicio del desplazamiento.

Diferentes posiciones en fseek()
PosiciónSignificado
SEEK_SETDesplazar desde el principio del archivo.
SEEK_END

Desplazar desde el final del archivo.

SEEK_CUR

Desplazar el cursor desde la posición actual del cursor en el archivo.

Ejemplo5: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! No se pudo abrir el archivo");
       //Si el puntero de archivo devuelve NULL, el programa se cierra.
       exit(1);
   }
   
   // Mover el cursor al final del archivo.
   fseek(fptr, -sizeof(struct threeNum), SEEK_END);
   for(n = 1; n < 5; ++n)
   {
      fread(&num, sizeof(struct threeNum), 1, fptr); 
      printf("\n"1: %d\t
2: %d\t
3: %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 y mostrar los registros del archivo program.bin en orden inverso (desde el último hasta el primero).