C getline() - comment traiter avec des tampons / comment lire un nombre inconnu de valeurs dans un tableau
Tout d'abord, un peu de contexte: je suis d'essayer d'obtenir une liste de nombres entiers à partir d'un fichier externe et de les mettre dans un tableau. Je suis à l'aide de getline pour analyser le fichier d'entrée ligne par ligne:
int lines = 0;
size_t * inputBuffer = (size_t *) malloc(sizeof(size_t));
char * storage = NULL;
Je fais appel getline comme suit:
getline(&storage, &s, input)
J'ai entendu à partir de la page de man getline que si vous fournissez un size_t * mémoire tampon, vous pouvez avoir getline redimensionner pour vous quand il dépasse l'allocation d'octets. Ma question est, que pouvez-vous utiliser ce tampon? Il contient tous les éléments que vous avez lu avec getline()? Est-il plus simple à lire à partir de ce buffer, ou pour traverser l'entrée dans une manière différente lors de la mise de ces entiers dans un tableau? Merci!
OriginalL'auteur theeggman85 | 2012-02-07
Vous devez vous connecter pour publier un commentaire.
La mémoire tampon ne contient que la dernier ligne vous lire avec
getline
. Le but est simplement de prendre un peu de l'effort de gestion de la mémoire hors de votre code.Ce qui va se passer si vous appelez plusieurs fois
getline
, en lui passant le même tampon à plusieurs reprises, c'est que le tampon d'étendre la longueur de la plus longue ligne dans votre fichier et d'y rester. Chaque appel de remplacer son contenu par la ligne suivante.Vous n'êtes pas fournir une
size_t*
, vous êtes en lui donnant unchar*
.Si vous
fseek
revenir au début du fichier (ou le fermez et ouvrez à nouveau), oui. Vous pouvez également utiliser une liste chaînée ou autres de manière dynamique la croissance de la structure à seulement besoin d'un laissez-passer.Merci, cela a fonctionné à merveille!
OriginalL'auteur Borealid
Ce n'est pas l'utilisation correcte de
getline
. Je vous suggère fortement de lire soigneusement son page de man.Vous pourriez avoir des code comme
BTW, vous pourrait (et devrait probablement mieux) mettre
... après le
while
boucle (pour garder la mémoire tampon de ligne affectées d'une ligne à l'autre), et dans la plupart des cas, il est préférable de le faire (pour éviter de trop fréquentesmalloc
-s degetline
).Avis que
getline
est ISO/IEC TR 24731-2:2010 extension (voir n1248).Le
process_line
peut en fait être ce que vous voulez. Vous pourriez avoir unchar**linearr
pointeur, etmalloc
etc... Puis utiliserlinearr[i++] = strdup(linebuf);
Le problème que je crains, c'est que lorsque vous malloc vous devez avoir une taille définie, correct? Et si je suis à la fois en comptant les éléments dans le tableau et de les ajouter au tableau en une seule passe, je suis pas sûr de la façon d'obtenir la taille si je ne suis pas en utilisant quelque chose comme les listes chaînées.
Mais vous pouvez croître de façon dynamique le tableau au moment de l'exécution (par
malloc
un plus gros, puis de copier le contenu de l'ancien variante, puisfree
compte que la variante ancienne et utiliser le nouveau grandmalloc
-auf s i indiqué). Vous avez certainement n'avez pas besoin de compter les lignes... Juste croître le tableau quand il le faut!N'est-ce pas prendre beaucoup de temps de traitement, de copier l'ensemble du tableau à chaque passage dans la boucle for? Je peux certainement voir que de travail même si.
OriginalL'auteur Basile Starynkevitch