Comment fgets() une ligne spécifique à partir d'un fichier en C?
Donc, j'essaie de trouver un moyen de fgets() une ligne spécifique dans un fichier texte en C, pour copier le contenu de la ligne dans une base plus permanente de la mémoire tampon:
Essentiellement, je me demandais si il y avait un moyen de le faire sans avoir quelque chose de similaire pour le code suivant:
FILE *fp;
fp = fopen(filename, "r");
char line[256];
char * buffer;
int targetline = 10;
while( targetline > 0)
{
fgets(line, 256, fp)
}
buffer =(char*)malloc(sizeof(char) * strlen(line));
strcpy(buffer, line);
Donc, fondamentalement, je ne veux pas à parcourir le fichier n-1 fois juste pour arriver à la nième ligne... il ne semble pas très efficace (et, de ce fait les devoirs, j'ai besoin d'obtenir un 100% haha).
Toute aide serait appréciée.
- Si vos lignes peuvent avoir une longueur arbitraire, comment vous attendez-vous à sauter
n
lignes en temps constant? - La seule vraie solution est de construire un indice de l'endroit où chaque ligne commence (lire le fichier une fois, la construction de l'index, puis vous pouvez l'utiliser pour chercher directement à une ligne jusqu'à ce que les modifications du fichier). Notez également que votre
malloc
besoin pour ajouter 1 à laisser de l'espace pour le NUL de terminaison. - Certains mécanismes de stockage des fichiers texte pourrait plausiblement fournir un moyen d'accéder à la Nième ligne en temps constant, ou au moins mieux que le temps linéaire. Probablement certains des formats de fichiers utilisés sur les machines virtuelles ce faire. Mais la bibliothèque C standard ne pas exposer de tels mécanismes, et sur la plupart des systèmes d'exploitation, il n'est même pas possible pour les fichiers de texte brut, à moins que vous créez un index vous-même. Il n'est donc pas déraisonnable de question, mais la réponse est non.
Vous devez vous connecter pour publier un commentaire.
Sauf si vous savez quelque chose de plus sur le fichier, vous ne pouvez pas accéder à des lignes au hasard. De nouvelles lignes sont délimitées par la présence de l'extrémité de la ligne de caractères et ils peuvent, en général, se produire n'importe où. Les fichiers de texte ne viennent pas avec un carte ou indice qui vous permettra de sauter à la nème de la ligne.
Si vous saviez que, disons, chaque ligne du fichier est de la même longueur, alors vous pouvez utiliser random access pour accéder à une ligne en particulier. Sans la connaissance de ce genre, vous n'avez pas le choix mais pour itérer sur l'ensemble du fichier jusqu'à ce que vous atteignez votre ligne désiré.
Si vous connaissez la longueur de chaque ligne, vous pouvez utiliser fseek pour passer à la ligne que vous souhaitez.
Sinon, vous devez aller à travers toutes les lignes.
Tout d'abord, votre ligne
est mieux écrit que:
La
+ 1
est nécessaire pour donner de l'espace pour la terminaison '\0
caractère';strlen()
ne pas tenir compte de cela. Casting le résultat demalloc()
en C n'est pas nécessaire, et, dans certains cas, peut masquer des erreurs.sizeof(char)
est de 1 par définition, ce n'est donc pas nécessaire.Et vous ne jamais modifier la valeur de
targetline
, de sorte que la boucle ne sera jamais la fin.Mais pour répondre à votre question, si vous avez un fichier texte et que vous voulez lire la Nième ligne, vous avez à lire et à ignorer le premier N-1 lignes pour l'obtenir. (Il est possible de mettre en place un index séparé, mais la création de l'indice nécessite la lecture du fichier, et en gardant l'index actuel, comme les modifications de fichiers est un problème difficile, probablement au-delà de ce que vous faites maintenant. Et ce n'est pas particulièrement nécessaire; le temps de lire 10 lignes à partir d'un fichier ne sera pas perceptible.)
J'ai peur, il n'y a pas d'autre moyen pour obtenir nième ligne dans le fichier. Vous devez passer à travers. Il n'y a pas de hasard l'accès à l'intérieur du fichier.
Si vous voulez obtenir le n-ième ligne à partir d'un fichier texte, vous devez lire les n-1 lignes avant. C'est la nature d'un fichier séquentiel. Sauf si vous savez que toutes les lignes ont la même longueur, il n'y a aucun moyen fiable de la position au début d'une ligne en particulier.