En el ámbito de la programación en C, gestionar eficazmente la entrada, la salida y la memoria es fundamental. Para ayudarlo a comprender estos conceptos críticos, get_next_line es un proyecto en el que escribirá una función que lee un archivo línea por línea usando un descriptor de archivo. Cada invocación de la función lee la siguiente línea del archivo, lo que le permite procesar todo el contenido del archivo, una línea a la vez.
Un descriptor de archivo es un número entero no negativo que identifica de forma única un archivo abierto en un sistema. Cuando un programa abre un archivo, el sistema operativo devuelve un descriptor de archivo que puede usarse para hacer referencia a ese archivo en operaciones posteriores, como leer, escribir o cerrar el archivo. Los descriptores de archivos son una abstracción utilizada por el sistema operativo para administrar varios recursos de E/S, incluidos archivos, sockets y canalizaciones.
0, 1 y 2 (entrada estándar, salida estándar y error estándar) en el Proceso A son independientes y están separados de los descriptores de archivo en el Proceso B. Este aislamiento garantiza que las operaciones de archivos en un proceso no interfieran con aquellas en otro.
Cada descriptor de archivo está asociado con una entrada de la tabla de descriptores de archivo que contiene información esencial sobre el archivo. Esto incluye la ruta del archivo, los permisos de acceso y el desplazamiento actual, que rastrea la posición dentro del archivo para operaciones de lectura/escritura. Esta estructura permite que el sistema operativo administre múltiples archivos abiertos de manera eficiente y garantice el acceso y la manipulación de datos correctos.
Tenga en cuenta que el sistema operativo reserva los descriptores de archivo 0, 1 y 2 para transmisiones estándar. El descriptor de archivo 0 se utiliza para la entrada estándar (stdin), que normalmente representa la entrada desde el teclado. El descriptor de archivo 1 se utiliza para la salida estándar (stdout), que representa la salida a la pantalla o terminal. El descriptor de archivo 2 se utiliza para el error estándar (stderr), que también representa la salida a la pantalla o al terminal, pero está diseñado específicamente para mensajes de error. Estos descriptores de archivos reservados garantizan que las operaciones básicas de entrada y salida se puedan gestionar de forma coherente en diferentes programas y entornos. Cualquier descriptor de archivo devuelto por la función de apertura será 3 o superior, lo que garantiza que no entre en conflicto con estas secuencias estándar.
'#include
'
'#include' int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}
Un descriptor de archivo, representado como un número entero, se obtiene usando la función open, que toma dos parámetros: el nombre del archivo (o ruta) y las banderas que determinan los permisos de acceso al archivo. Por ejemplo, para leer el contenido de un archivo, usamos el indicador O_RDONLY (solo lectura). Para leer y escribir, usamos el indicador O_RDWR. Si bien hay muchas opciones disponibles, usaremos solo O_RDONLY para este proyecto. La función de apertura devuelve un número entero no negativo, que es el descriptor del archivo si la operación es exitosa; de lo contrario, devuelve -1 para indicar un error (no tienes permiso para acceder a ejemplo.txt). Tenga en cuenta que la función de apertura está en la biblioteca unistd.h y los indicadores de permiso están definidos en fcntl.h.
'#include
'
'#include'
'#include'
'#define BUFFER_SIZE 4'int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}
char buffer[BUFFER_SIZE];
read(fd, buffer, sizeof(buffer)-1);
printf("1st call : %s\n", buffer);
// prints the first 3 bytes
read(fd, buffer, sizeof(buffer)-1);
printf("2nd call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("3rd call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("4th call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("5th call : %s\n", buffer);
resultado del código
1.ª llamada: HEL
2.ª convocatoria: LO
3.ª convocatoria: TRABAJO
4ta convocatoria : LD
5ta convocatoria: (nula)
La función de lectura, proporcionada por la biblioteca unistd.h, se utiliza para leer datos de un descriptor de archivo. Se necesitan tres parámetros: el descriptor del archivo, un búfer para almacenar los datos leídos y el número de bytes para leer del archivo. La función de lectura devuelve el número de bytes leídos del archivo.
En la tabla de descriptores de archivos, hay un atributo llamado desplazamiento. El desplazamiento realiza un seguimiento de la posición actual dentro del archivo. Cada vez que se llama a la función de lectura, lee datos a partir del desplazamiento actual y luego avanza el desplazamiento según el número de bytes leídos. Esto garantiza que las lecturas posteriores continúen desde donde terminó la última lectura.
En nuestro ejemplo:
La segunda llamada a lectura lee los siguientes 3 bytes a partir del desplazamiento actualizado (3) y luego actualiza el desplazamiento a 6.
etc ...
La quinta llamada al búfer de lectura será nula y la lectura devuelve 0, lo que indica el final del archivo.
Este proceso continúa hasta que se hayan leído todos los datos del archivo o se produzca un error. El búfer termina en nulo después de cada lectura para garantizar que se pueda imprimir como una cadena.
char *get_next_line(int fd) toma como parámetro un descriptor de archivo de un archivo y devuelve una línea para cada llamada. Si llega al final del archivo, devuelve NULL.
https://github.com/Its-JoeTheKing/get_next_line
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3