2010-10-14 4 views
2

Je souhaite lire un fichier texte dans un tableau de chaînes et pouvoir accéder au contenu du tableau via une boucle. Le code que j'ai me permet de stocker seulement la dernière ligne du fichier texte au lieu du fichier entier; Où vais-je mal?Comment stocker une chaîne à partir d'un fichier texte dans un tableau en C

#define MAX 10000 

int main (int argc, char *argv[]) 
{ 
    FILE *fp; 
    char str[MAX]; 
    char *x[MAX]; 
    int i =0; 
    char y[MAX]; 

    if((fp = fopen("550.txt", "r"))==NULL) { 
    printf("Cannot open file.\n"); 
    exit(1);} 

    while(!feof(fp)) { 
     while(fgets(str, sizeof str, fp)) { 
      x[i]= str; 
      printf("%s", str); 
      printf("%s", *(x+i)); 
      i++; 
     } 
    } 


for(i=0;i<100;i++){ 
    printf("%s", *(x+i)); 
} 

    fclose(fp); 

    return 0; 
} 
+0

Ne pas utiliser feof() pour boucle de régulation cond.http: //c-faq.com/stdio/feof.html – Nyan

Répondre

3

Vous allouez seulement un tableau de chaînesstr. À chaque itération de la boucle, vous écrasez simplement str. L'affectation x[i] = str attribue le pointeur valeur de str à x[i]. Vous remarquerez que chaque membre du tableau x pointe vers le même tamponstr à la fin de la boucle. Vous devez créer plusieurs buffers.

Une façon de le faire est de définir le nombre maximum de lignes à l'aide #define LINES 100 puis de déclarer x comme suit

char x[LINES][MAX]; 

puis effectuez une strcpy à chaque itération:

while(fgets(str, sizeof str, fp)) { 
    strcpy(x[i], str); 
    printf("%s", str); 
    printf("%s", *(x+i)); 
    i++; 
} 

Remarque que vous devriez envisager d'utiliser la méthode strncpy au lieu de strcpy et vérifiez la valeur de retour pour vous assurer que les tampons ne sont pas surchargés.

+0

Êtes-vous sûr que fgets ne zéro fin la mémoire tampon pour l'entrée de temps? – Nyan

+1

Pourquoi cette réponse a-t-elle été refusée? –

1

Vous devez faire une copie de chaque chaîne:

x[i] = strdup(str); 

ce que vous faites en ce moment est de faire chaque point x[i] au même tampon, qui contiendra la dernière ligne du fichier une fois que vous J'ai fini.

(Note: vous aurez également besoin de free() toutes les chaînes x[i] vous créez avec strdup().)

+0

strdup n'est pas ANSI C – user411313

0

vous n'êtes pas stroing la ligne que vous lisez partout. Il est tamponné en str mais vous l'écrasez avec la ligne suivante. utiliser strdup.

x[i] = strdup(str); 
Questions connexes