comment créer un tableau dynamic de chaînes en C à partir d’un fichier d’entrée

Je n’ai pas fait de programmation en C depuis un certain temps mais j’ai ce qui suit qui produit une chaîne mais je voudrais le mettre dans un tableau que je peux ensuite manipuler (au niveau des commentaires ——— code). Je pense que je dois déclarer la taille du tableau mais que je dois gérer un montant variable. Je pensais à faire quelque chose comme system('wc -l filename') mais cela semble vraiment terrible. Doit être un meilleur moyen:

 #include  int main() { char *inname = "test.txt"; FILE *infile; char line_buffer[BUFSIZ]; /* BUFSIZ is defined if you include stdio.h */ char line_number; infile = fopen(inname, "r"); if (!infile) { printf("Couldn't open file %s for reading.\n", inname); return 0; } printf("Opened file %s for reading.\n", inname); line_number = 0; while (fgets(line_buffer, sizeof(line_buffer), infile)) { ++line_number; /* note that the newline is in the buffer */ // --------------------- // would like to put into an array of ssortingngs here rather than just printf'ing out out printf("%4d: %s", line_number, line_buffer); } printf("\nTotal number of lines = %d\n", line_number); return 0; } 

Tout d’abord:

 char *inname = "test.txt"; 

devrait être

 const char *inname = "test.txt"; 

Ensuite, vous souhaitez allouer un tableau suffisamment grand pour stocker toutes les lignes. Comme vous ne connaissez pas le nombre de lignes au préalable, vous pouvez utiliser une extension de stockage exponentielle: doublez la taille de la baie lorsqu’elle est épuisée.

Exemple de code (vérification des erreurs omise pour plus de clarté, ne pas copier-coller ceci dans le code de production):

 size_t n = 0; size_t alloc_size = 4; char buffer[LINE_MAX]; char **arr = malloc(alloc_size * sizeof arr[0]); while (fgets(buffer, sizeof buffer, fp) != NULL) { if (++n > alloc_size) { alloc_size *= 2; arr = realloc(arr, alloc_size * sizeof arr[0]); // don't do this } arr[n - 1] = strdup(buffer); } 

Vous pouvez parcourir tout le fichier (si le fichier est volumineux) et compter chaque “nouvelle ligne”. Créez ensuite un tableau avec cette taille de compte, puis rembobinez le fichier et lisez chaque ligne.

mfg

Malheureusement, il n’y a pas de tableau dynamic dans C (si vous pensez à quelque chose comme le vecteur en C ++). Vous pouvez utiliser la liste et chaque fois que vous lisez une ligne du fichier, ajoutez simplement une nouvelle entrée de liste à la fin de la liste.

Il existe également un tableau “dynamic” depuis C99 appelé VLA (tableau de longueur variable). Vous pouvez déclarer un tableau avec une taille dynamic (ou plutôt connu lorsque le programme est en cours d’exécution), mais cela ne vous aidera pas car vous devrez à chaque fois déclarer un nouveau tableau dont la taille est supérieure à la précédente. ce serait très inefficace.

Donc, il serait difficile de trouver quelque chose de meilleur que la liste.