J'essaie de stocker une gamme de ficelles dans un double pointeur, mais cela ne semble pas le faire.
char **pointerA;
char *pointerB;
int count;
FILE* file = fopen("textfile.ini", "r");
pointerA = (char **) malloc (sizeof(*pointerA));
pointerB = (char *) malloc (sizeof(*pointerB));
while(fgets(pointerB, 200, file) !== NULL)
{
pointerA = (char **)realloc(pointerA, sizeof(char *) * (strlen(pointerB) + 1));
pointerA[count] = pointerB;
count++;
}
fclose(file);
3 Réponses :
vous allouez 1 IT doit être quelque chose comme ça p> pointerb = (char *) malloc (taille de (* pointerb)); code> char code> et lisez dans le fgets code> jusqu'à 200. p> EDIT H1>
Alors, que devrais-je faire? Je ne comprends pas bien où je fais mal
Vous devez affecter chaque élément de Pointera comme SO:
int nbLines = 10; //number of lines to read in file
char** pointerA = ( char** ) malloc ( sizeof ( char* ) * nbLines ); //allocate 2D array. Each element points to another string
for ( int i = 0; i < nbLines; ++i ) {
char line [ 200 ];
fgets ( line , 200 , file ); //get a line from the file
pointerA [ i ] = ( char* ) malloc ( sizeof ( char ) * strlen ( line ) ); //allocate a string with the size of that line
pointerA [ i ] = line;
}
C'est fondamentalement le codage dur. Je veux quelque chose qui change de manière dynamique lorsqu'il y a plus de lignes ajoutées au fichier texte
Vous pouvez avoir une fonction qui compte le nombre de lignes dans le fichier: Stackoverflow.com/questions/12733105/... Vous ne pouvez malheureusement pas faire mieux en langage C sans garder votre code relativement simple
Si vous voulez que le programme fonctionne avec n cordes, vous pouvez faire quelque chose comme ceci: Bien sûr, vous devez vérifier que les résultats du Si vous voulez de meilleures performances, vous ne devriez pas augmenter Le problème avec cette approche est que vous aurez un dernier espace inutilisé Malloc CODE> et realloc code> ne sont pas null code> avant d'utiliser ces variables, vous n'écracez généralement pas directement le pointeur que vous utilisez avec un realloc code> mais créer un nouveau au lieu de cela et écrasez l'ancien si ce n'est pas null code> pour éviter d'avoir des fuites de mémoire. p> Pointera code> par 1 à chaque boucle mais plus que cela (généralement double) et gardez un compteur d'espaces usagés. Gardez également à l'esprit que la ligne de caractères 200 code> signifie que la longueur maximale de la ligne est en réalité 199 code> puisque le dernier caractère est \ 0 code>. < / p> Malloc code> D que vous devez prendre en charge plus tard. p> p>