0
votes

Pourquoi les fgets réinitialisent-ils mon élément double pointeur?

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);

c

0 commentaires

3 Réponses :


0
votes

pointerb = (char *) malloc (taille de (* pointerb));

vous allouez 1 char et lisez dans le fgets jusqu'à 200.

EDIT

IT doit être quelque chose comme ça xxx


1 commentaires

Alors, que devrais-je faire? Je ne comprends pas bien où je fais mal



0
votes

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; 

}


2 commentaires

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



0
votes

Si vous voulez que le programme fonctionne avec n cordes, vous pouvez faire quelque chose comme ceci: XXX

Bien sûr, vous devez vérifier que les résultats du Malloc et realloc ne sont pas null avant d'utiliser ces variables, vous n'écracez généralement pas directement le pointeur que vous utilisez avec un realloc mais créer un nouveau au lieu de cela et écrasez l'ancien si ce n'est pas null pour éviter d'avoir des fuites de mémoire.

Si vous voulez de meilleures performances, vous ne devriez pas augmenter Pointera 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 signifie que la longueur maximale de la ligne est en réalité 199 puisque le dernier caractère est \ 0 . < / p>

Le problème avec cette approche est que vous aurez un dernier espace inutilisé Malloc D que vous devez prendre en charge plus tard.


0 commentaires