2017-09-16 17 views
-1

J'ai un fichier texte et chaque ligne contient le nom de la personne et le sexe en valeur séparée par des virgules. J'essaie de lire ligne par ligne et de créer le tableau de la personne. Je ne sais pas ce qui s'est passé avec mon code tous les éléments du tableau est défini sur la dernière ligne du fichier texte. (Si la dernière ligne a Sam, Homme, tous les éléments du tableau de personne est définie sur Name = Sam)fichier lu ligne par ligne dans c réinitialisation valeur à la dernière entrée

struct Person{ 
     char* Name; 
     char* Gender; 
    }; 
    struct Person person[100]; 

    void readAllFromFile(){ 
     FILE * fp; 
     char currentLine[256]; 
     int fd; 
     if((fp = fopen ("test.txt", "r"))==NULL){ 
      perror("Can not open"); 
      fclose(fp); 
      return; 
     } 
     int currentLineNo=0; 
     char *items; 
     while (fgets(currentLine, sizeof(currentLine), fp)) { 
      items=strtok(currentLine,","); 
      struct Person tempPerson; 
      int iter=0; 
      while(items != NULL) 
      { 
       if(iter==0){ 
        tempPerson.Name=items; 
       } 
       else { 
        tempPerson.Gender=items; 
       } 
      iter++; 
      items=strtok(NULL,","); 
      } 
      person[currentLineNo]=tempPerson; 
      currentLineNo++; 
     } 

     /*Printing element of the array*/ 
     int i; 
     for(i=0;i<currentLineNo;i++){ 
     printf("%s\n",person[i].Name); 
    } 
    fclose(fp); 
    } 

    int main() { 
    readAllFromFile(); 
    return 0; 
    } 
+0

Copie possible de [C: utilisation de fgets pour créer une liste chaînée de char \ *] (https://stackoverflow.com/questions/46243081/c-fgets-usage-for-building-a-linked-list- of-char) –

+0

Deuxième ce soir, même numéro. beaucoup, beaucoup de doublons :( –

Répondre

1

Le nom de chaque personne se trouve au même endroit dans la mémoire: currentLine. Vous attribuez cette adresse à chaque Person s Name, de sorte que tous les noms seront affichés de la même manière. Chose semblable pour chaque Gender. Notez que, étant donné que currentLine est local à readAllFromFile, une fois que cette fonction est retournée, cet espace peut être utilisé pour d'autres choses, détruisant celui que vous avez réussi à conserver. Chaque Person a besoin de sa propre allocation d'espace pour ses Name et Gender.