La lecture de chaque ligne du fichier dans un tableau
Je suis en train de lire un fichier et que vous voulez mettre chaque ligne dans une chaîne de caractères dans un tableau. La longueur du fichier est de l'arbitraire et de la longueur de chaque ligne est arbitraire (même à supposer qu'il sera à moins de 100 caractères).
Voici ce que j'ai et ce n'est pas la compilation. C'est un tableau à un tableau de caractères, non? Donc ne devrait-il pas être char** words = (**char)malloc(sizeof(*char));
?
#include <stdio.h>
#include <stdlib.h>
int main(){
int BUFSIZE = 32767;//max number of lines to read
char** words = (**char)malloc(sizeof(*char));//gives error: expected expression before 'char'
FILE *fp = fopen("coll.txt", "r");
if (fp == 0){
fprintf(stderr, "Error opening file");
exit(1);
}
int i = 0;
words[i] = malloc(BUFSIZE);
while(fscanf(fp, "%100s", words[i]) == 1)//no line will be longer than 100
{
i++;
words[i] = realloc(words, sizeof(char*)*i);
}
int j;
for(j = 0; j < i; j++)
printf("%s\n", words);
return 0;
}
Remarque: j'ai lu "Lecture à partir d'un fichier et le stocker dans le tableau" mais il n'a pas répondu à ma question.
il doit être de type char*... vous êtes à essayer de trouver la taille du pointeur de caractère...
Notez que
Notez que
%100s
(a) sauter menant l'espace blanc et de l'arrêt de la lecture à l'espace blanc après un non-caractère espace blanc, et (b) un débordement de mémoire tampon de taille 100 par un octet, ce qui pourrait la matière. Vous devez spécifier un de moins que la taille du tableau dans la spécification de conversion.OriginalL'auteur Celeritas | 2013-10-04
Vous devez vous connecter pour publier un commentaire.
Il existe quelques problèmes avec votre programme. Le realloc() n'est pas utilisé correctement. Je préfère aussi fgets() pour obtenir une ligne. Voici ma solution. Cela utilise aussi le realloc() pour augmenter l'allocation de la mémoire tampon lignes de sorte que vous n'avez ni de connaître le nombre de lignes à l'avance, ni ne vous devez lire le fichier en deux passes (plus rapide). C'est une technique à utiliser lorsque vous ne savez pas combien de mémoire vous aurez à allouer à l'avance.
for
boucle sur une ligne sur son propre. Lorsque ajouté la même ligne après la fermeture de la parenthèse, il est trop facilement confondu avec une faute de frappe, ou négligé. Théoriquement, vous pourriez avoir plusieurs'\r'
caractères sur une seule ligne, il se pourrait que la matière (mais plus ne sera probablement pas).J'ai mis en œuvre vos suggestions. Je vous remercie.
comment avez-vous décidé sur la valeur de 128 pour
int lines_allocated
?Bonne question. Un peu au hasard. Vous voulez choisir un nombre qui n'est pas si grand que vous êtes plus de l'allocation de mémoire d'abord, mais pas si petit que de causer beaucoup de realloc appels. Vous êtes seulement à l'allocation d'un tableau de pointeurs, de sorte que vous pourriez commencer avec une plus grande valeur. Le facteur 2 multiplicateur pourrait également être ajustée. J'ai vu de 1,5 utilisé. Il dépend en partie de ce que vous pensez que votre cas typique sera ainsi. Si vous le voulez bien, vous pourriez faire une étude sur l'utilisation de la mémoire et temps d'exécution pour les différents cas afin d'optimiser les valeurs, mais la variation de la performance serait probablement être petit.
Belle réponse! La boucle for pour supprimer
\n
et/ou\r
à partir de la fin de la ligne supprime un caractère à plusieurs, en mettant la\0
au dernier caractère de la chaîne qui n'est pas un caractère de saut de ligne (donc tronquer que le dernier caractère). Vous devrez probablement changer dewords[i][j]
àwords[i][j+1]
. Aussi, c'est une bonne habitude de fermer le fichier ouvert avecfclose()
.OriginalL'auteur willus
Vous devez modifier la ligne:
dans cette:
OriginalL'auteur Cobain