2017-09-16 81 views
-1

我有一个文本文件,每行包含逗号分隔值中的人名和性别。我正在尝试逐行读取并创建人员数组。不知道我的代码出了什么问题数组的所有元素都设置为文本文件的最后一行。 (如果最后一行具有山姆,男,人阵列的所有元件被设置为名称=萨姆)文件在c中逐行读取将值复位到最后一项

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

[C:用于构建char *链接列表的fgets用法]的可能重复(https://stackoverflow.com/questions/46243081/c-fgets-usage-for-building-a-linked-list- char) –

+0

今晚第二个问题,同样的问题。很多,很多重复:( –

回答

1

每个人的名称位于在存储器中的相同的地方:currentLine。您将该地址分配给每个Person s Name,因此每个名称都将显示相同。类似的事情每个Gender

请注意,由于currentLine位于readAllFromFile的本地,所以一旦该函数返回,该空间可能用于其他事情,就会废弃您设法保留的那个空间Name

每个Person需要它自己的空间分配NameGender