2015-05-23 21 views
1

我想從txt文件中讀取一些數據,並將其存儲在s_person結構體中,而不是打印後者。 文本文件結構如下所示:從txt文件讀入動態分配的

john 43 23 
steven 23 44 
micheal 11 0 

數組變量是爲那些2號旁邊的txt文件名。

#include<stdio.h> 
#include<stdlib.h> 

struct s_person { 
    char *name; 
    int *array; 
}; 

在這裏我有構造函數,它構造你想從文件中讀取的s_person數。

s_person* construct(int number){  
    s_person *person = (s_person*)malloc(sizeof(s_person) * number); 
    if(person){ 
     person->name = (char*)malloc(sizeof(char) * 50); 
     person->array = (int*)malloc(sizeof(int) * 2); 
    } 
    return person; 
} 

這裏是從txt文件中讀取數據的函數。如果我必須讀取多於一行,它似乎在第二次運行時通過while循環在fscanf(f,"%s", osoba[i].name);處中斷。

void getData(s_person *person, int number) { 
     FILE *f = fopen("text.txt", "r"); 
     if(f == NULL){ 
      printf("Error\n"); 
      return; 
     } 
     int i=0, j; 
     while(i < number) 
     { 
      fscanf(f,"%s", person[i].name); // Break point at second loop through 

      // Read numbers from txt file 
      for(j=0; j<2; j++){ 
       fscanf(f, "%d", &person[i].array[j]); 
      } 
      if(feof(f)){ 
       break; 
      } 
      i++; 
     } 

     fclose(f); 
    } 

我也有功能,打印數據:

void printData(s_person *person, int number) 
{ 
    int i, j; 
    for(i=0; i<number; i++){ 
     printf("%s ", person[i].name); 

     for(j=0; j<2;j++) 
     { 
      printf("%d ", person[i].array[j]); 
     } 
     printf("\n"); 
    } 
} 

及主要如下所示:

main() 
{ 
    int number = 2; 
    s_person *person = construct(number); 
    getData(person, number); 
    printData(person, number); 
    free(person); 
} 

我覺得這件事情與fscanf函數是我做錯了,但我還沒有」 t斯萊特想什麼。

如果我有一行數據要讀取,它會很好地工作。 (int number = 1;)。但是如果它必須讀取多於一行,它會在第二次運行時斷開,while循環在fscanf(f,"%s", osoba[i].name);

回答

1

對於s_personnumber有需要進行內存分配給namearray

s_person* construct(int number){ 
    int each; 
    s_person *person = (s_person*)malloc(sizeof(s_person) * number); 
    if (person) { 
     for (each = 0; each < number; each++){ 
      person[each].name = (char*)malloc(sizeof(char) * 50); 
      person[each].array = (int*)malloc(sizeof(int) * 2); 
     } 
    } 
    return person; 
} 
+0

感謝。它現在有效。只是一個語法變化:它顯示人[每個] - >名稱的錯誤,但它可以與person [each] .name正常工作 –