English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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.
Al procesar archivos, debes entender dos tipos de archivos:
archivos de texto
archivos binarios
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.
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.
En C, puedes realizar cuatro operaciones principales con los archivos:
crear un archivo nuevo
abrir un archivo existente
Cierre de archivo
leer información y escribirla en el archivo
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;
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.
Modo | Significado del modo | durante el tiempo en que el archivo no existe |
---|---|---|
r | Con soloLecturaModoAbrir. | Si el archivo no existe, fopen() devolverá NULL. |
rb | Abrir para leer en modo binario. | Si el archivo no existe, fopen() devolverá NULL. |
w | Abrir 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á. |
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+ | 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á. |
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á.
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.
#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.
#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.
En el caso de archivos binarios, las funciones fread() y fwrite() se utilizan respectivamente para leer y escribir en el archivo en el disco.
Para escribir en un archivo binario, se debe usar la función fwrite(). Estas funciones admiten cuatro parámetros:
La dirección de los datos que se escribirán en el disco
El tamaño de los datos que se escribirán en el disco
La cantidad de datos de este tipo
El puntero al archivo donde se escribe.
fwrite(addressData, sizeData, numbersData, pointerToFile);
#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.
La función fread() también usa un formato similar al de la función fwrite() anterior.4parámetros.
fread(addressData, sizeData, numbersData, pointerToFile);
#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.
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.
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.
Posición | Significado |
---|---|
SEEK_SET | Desplazar 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. |
#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).