Dans le domaine de la programmation C, la gestion efficace des entrées, des sorties et de la mémoire est fondamentale. Pour vous aider à comprendre ces concepts critiques, get_next_line est un projet dans lequel vous écrirez une fonction qui lit un fichier ligne par ligne à l'aide d'un descripteur de fichier. Chaque appel de la fonction lit la ligne suivante du fichier, vous permettant de traiter l'intégralité du contenu du fichier une ligne à la fois.
Un descripteur de fichier est un entier non négatif qui identifie de manière unique un fichier ouvert dans un système. Lorsqu'un programme ouvre un fichier, le système d'exploitation renvoie un descripteur de fichier qui peut être utilisé pour faire référence à ce fichier lors d'opérations ultérieures, telles que la lecture, l'écriture ou la fermeture du fichier. Les descripteurs de fichiers sont une abstraction utilisée par le système d'exploitation pour gérer diverses ressources d'E/S, notamment les fichiers, les sockets et les canaux.
0, 1 et 2 (entrée standard, sortie standard et erreur standard) dans le processus A sont indépendants et distincts des descripteurs de fichier dans le processus B. Cette isolation garantit que les opérations sur les fichiers dans un processus n'interfèrent pas avec celles du processus B. un autre.
Chaque descripteur de fichier est associé à une entrée de table de descripteur de fichier qui contient des informations essentielles sur le fichier. Cela inclut le chemin du fichier, les autorisations d'accès et le décalage actuel, qui suit la position dans le fichier pour les opérations de lecture/écriture. Cette structure permet au système d'exploitation de gérer efficacement plusieurs fichiers ouverts et de garantir un accès correct et une manipulation des données.
Notez que les descripteurs de fichiers 0, 1 et 2 sont réservés par le système d'exploitation pour les flux standard. Le descripteur de fichier 0 est utilisé pour l'entrée standard (stdin), qui représente généralement l'entrée du clavier. Le descripteur de fichier 1 est utilisé pour la sortie standard (stdout), qui représente la sortie vers l'écran ou le terminal. Le descripteur de fichier 2 est utilisé pour l'erreur standard (stderr), qui représente également la sortie à l'écran ou au terminal mais est spécifiquement destiné aux messages d'erreur. Ces descripteurs de fichiers réservés garantissent que les opérations d'entrée et de sortie de base peuvent être gérées de manière cohérente dans différents programmes et environnements. Tout descripteur de fichier renvoyé par la fonction open sera égal à 3 ou supérieur, garantissant qu'il n'entre pas en conflit avec ces flux standard.
'#include
'
'#include' int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}
Un descripteur de fichier, représenté sous forme d'entier, est obtenu à l'aide de la fonction open, qui prend deux paramètres : le nom (ou chemin) du fichier et les indicateurs qui déterminent les autorisations d'accès au fichier. Par exemple, pour lire le contenu d'un fichier, nous utilisons le flag O_RDONLY (lecture seule). Pour lire et écrire, nous utilisons le flag O_RDWR. Bien qu'il existe de nombreux indicateurs disponibles, nous utiliserons uniquement O_RDONLY pour ce projet. La fonction open renvoie un entier non négatif, qui est le descripteur de fichier si l'opération réussit ; sinon, il renvoie -1 pour indiquer une erreur (vous n'êtes pas autorisé à accéder à example.txt). Notez que la fonction open se trouve dans la bibliothèque unistd.h et que les indicateurs d'autorisation sont définis dans 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);
résultat du code
1er appel : HEL
2ème appel : LO
3ème appel : WOR
4ème appel : LD
5ème appel : (nul)
La fonction read, fournie par la bibliothèque unistd.h, est utilisée pour lire les données d'un descripteur de fichier. Il faut trois paramètres : le descripteur de fichier, un tampon pour stocker les données lues et le nombre d'octets à lire dans le fichier, la fonction de lecture renvoie le nombre d'octets lus dans le fichier.
Dans la table des descripteurs de fichiers, il y a un attribut appelé offset. Le décalage garde une trace de la position actuelle dans le fichier. Chaque fois que la fonction de lecture est appelée, elle lit les données en commençant par le décalage actuel, puis avance le décalage du nombre d'octets lus. Cela garantit que les lectures suivantes continuent là où la dernière lecture s'est arrêtée.
Dans notre exemple :
Le deuxième appel à read lit les 3 octets suivants à partir du décalage mis à jour (3), puis met à jour le décalage à 6.
etc ...
Le 5ème appel au tampon de lecture sera nul et la lecture renvoie 0 indiquant la fin du fichier.
Ce processus se poursuit jusqu'à ce que toutes les données aient été lues à partir du fichier ou qu'une erreur se produise. Le tampon se termine par un zéro après chaque lecture pour garantir qu'il peut être imprimé sous forme de chaîne.
char *get_next_line(int fd) prend en paramètre un descripteur de fichier d'un fichier et renvoie une ligne pour chaque appel. S'il atteint la fin du fichier, il renvoie NULL.
https://github.com/Its-JoeTheKing/get_next_line
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3