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?
- Cuando finaliza un programa, se pierden todos los datos. El almacenamiento en un archivo conservará sus datos incluso si el programa finaliza.
- Si tiene que ingresar una gran cantidad de datos, llevará mucho tiempo ingresarlos todos.
Sin embargo, si tiene un archivo que contiene todos los datos, puede acceder fácilmente al contenido del archivo usando algunos comandos en C. - Puede mover fácilmente sus datos de una computadora a otra sin ningún cambio.
Tipos de archivos
Cuando se trata de archivos, hay dos tipos de archivos que debe conocer:
- Archivos de texto
- 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:
- Crear un archivo nuevo
- Abrir un archivo existente
- Cerrar un archivo
- 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");
- Supongamos que el archivo
newprogram.txt
no existe en la ubicaciónE:\cprogram
. La primera función crea un nuevo archivo llamadonewprogram.txt
y lo abre para escribir según el modo 'w' .
El modo de escritura le permite crear y editar (sobrescribir) el contenido del archivo. - Ahora supongamos que el segundo archivo binario
oldprogram.bin
existe en la ubicaciónE:\cprogram
. La segunda función abre el archivo existente para leerlo en modo binario 'rb' .
El modo de lectura solo le permite leer el archivo, no puede escribir en el archivo.
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:
- dirección de datos a escribir en el disco
- tamaño de los datos que se escribirán en el disco
- número de este tipo de datos
- 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 | 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