2015-11-17 96 views
1

我有一些問題,我的代碼 我讀了文件,我的文件中的數據推入一個結構數據類型ç遍歷數組

但是當遍歷dataValue這應該是結構數組 它給了我相同的dataValue,特別是文件中的最後一個。

int main() { 
    FILE *file; 
    struct characteristic { 
     double * dval; 
     double n; 
     char * name; 
    }; 
    struct characteristic dataValue[150]; 
    if ((file = fopen("/XXX/XXX/XXX/XXX/data", "r")) 
      == NULL) { 
     puts("error reading file"); 
     exit(1); 
    } else { 
     int i = 0; 
     double var1, var2, var3, var4; 
     char * etiq = malloc(sizeof(char) * 100); 
     while (fscanf(file, "%lf,%lf,%lf,%lf,%s \n", &var1, &var2, &var3, &var4, 
       etiq) != EOF) { 
      struct characteristic *new_node; 
      new_node = (struct characteristic *) malloc(
        sizeof(struct characteristic)); 
      new_node->dval = &var1; 
      (new_node->dval)++; 
      new_node->dval = &var2; 
      (new_node->dval)++; 
      new_node->dval = &var3; 
      (new_node->dval)++; 
      new_node->dval = &var4; 
      new_node->name = etiq; 
      puts("================================================="); 

      printf("the name of characteristic number %d est : %s .\n", i, 
        new_node->name); 
      dataValue[i].dval = new_node->dval; 
      dataValue[i].name = new_node->name; 
      dataValue[i].n = i; 
      i++; 
     } 

    } 
    int i,j; 
    for (i = 0; i < sizeof(dataValue)/sizeof(struct characteristic); i++) { 
     printf("second name of characteristic number %d est : %s .\n", i, 
       dataValue[i].name); 
     for (j = 0; j < 4; j++) { 

      printf("bla value of vector number %d at index %d est : %lf \n", i, 
        j, *(dataValue[i].dval + j)); 
     } 
    } 
    return EXIT_SUCCESS; 
} 

文件containe數據,如: 1.0,2.7,4.9,1.5,名

+1

'(new_node-> DVAL)++'被遞增指針,然後您正在使用分配給它地址'&var4'到底。這個練習的重點是什麼? –

+0

我是一個java程序員c它對我來說有點困難'我通過做一些這樣的練習來學習它',我應該讀取一個文件並將數據推送到一個結構數組,並在最後對這些數據應用一些算法 – lsroudi

回答

3

你的代碼是使用未初始化的指針dval,並要指定它解決局部變量超出作用域的打印之前。這不是在C中創建數組的方法。使用malloc可以將數組分配到dval,但是您也必須使用free()該數組。既然你知道,那裏將是四個double S IN的節點,它會更簡單,使dval四個元素的數組,像這樣:

struct characteristic { 
    double dval[4]; 
    double n; 
    char * name; 
}; 

現在,你就可以利用指針或做任務數組語法:

dataValue[i].dval[0] = var1; 
dataValue[i].dval[1] = var2; 
dataValue[i].dval[2] = var3; 
dataValue[i].dval[3] = var4; 
dataValue[i].n = i; 
// Store etiq in the name, or make a copy: 
dataValue[i].name = etiq; 
// Prepare etiq for the next loop 
etiq = malloc(100); // No need to multiply by sizeof(char) 
+0

thanis你的幫助,我有一個額外的問題,爲什麼我不能使用這個:dataValue = new_node;或dataValue [i] = new_node;在while循環的enf之前 – lsroudi

+0

@lsroudi根本不需要'new_node'和動態分配。 'malloc'給你一個指針,但'dataValue'已經有了完整的'struct',可以直接接受你的數據。所有你需要做的就是在循環中爲'name'分配新的'et​​iq'。 – dasblinkenlight

1

struct包含一個指向double double *dval。看來你打算將它用作4個雙打的數組。但是你並沒有爲4次雙打分配內存。在你的struct中存儲4個雙打的推薦方式是在其中定義一個數組。

struct characteristic { 
    double dval[4]; 
    double n; 
    char * name; 
}; 

還有一個類似的問題,name。您在while循環外分配一次100個字節的內存,並獲得一個名爲etiq的指針。然後,對於dataValue的每個元素,您將name設置爲與您僅使用fscanf重寫的同一個塊相同的指針etiq。如果你想要一個char*而不是你的struct中的字符數組,使用strdup將字符串複製到一個新分配的內存塊(並記住要將它從結構體中獨立釋放)。例如。

new_node->name = strdup(etiq); 

或定義在你的結構namechar name[100]和要麼使用strcpy或直接傳遞到namefscanf