2011-12-25 101 views
0

我有一些麻煩用鏈表傳遞一個.csv文件的信息,一個struct傳遞信息通過文件的.csv一個struct ...C語言:使用鏈表

的文件就像:

1,3.234,hello,f 
3,4.2432,worldkind,o 
. 
. 
. 

我的C計劃:

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

#define MAX 50 
typedef struct TP 
{ 
    int key; 
    //data 
    int atomnum; 
    float massnum; 
    char nome[MAX+1]; 
    char sym[MAX+1]; 
    struct tableper *nseg; 
    struct tableper *nant; 
}tp; 

tp* putmemory(tp *dbase1) //function to put data to struct 
{ 
    FILE *fp1; 
    char *token,ch,temp[MAX]; 
    int *tokenint,i,aux[MAX],in=-1,flag=0; 
    char BUFFER[MAX],*aux2; 
    tp *nv; 

    if ((fp1 = fopen("TabelaPeriodica.csv","r")) == NULL) 
     printf("File could not be opened \n"); 

    while(!feof(fp1)) 
    { 
     while((ch=fgetc(fp1)) != '\r') 
     { 
      temp[++in]=ch; 
      if(ch == ',') 
      { 
       nv->key = ++i; 
       token = strtok(temp[++i],","); 
       nv->atomnum = token; 
       token = strtok(NULL,","); 
       nv->massnum = atof(token); 
       token = strtok(NULL,","); 
       strcpy(nv->nome,token); 
       token = strtok(NULL,","); 
       strcpy(nv->sym,token); 
       free(nv); 
      }  
     } 
    } 
} 
int main() 
{ 
    tp *dbase1; 
    putmemory(dbase1); 
    return 0; 
} 

我的問題是:

  1. 通過字符的向量串
  2. 的向量讀每一行,並在結構體保存
  3. 每次迭代節省NV(new_node)使用鏈表
+0

歡迎堆棧溢出:) – pmg 2011-12-25 10:53:55

+1

'而((CH =龜etc(FP1))!= '\ r')'只適用於Windows。我建議你用'while((ch = fgetc(fp1))!='\ n')'代替它,它在Windows和所有其他操作系統上都能很好地工作。 – pmg 2011-12-25 10:59:04

+0

什麼是struct tableper?這是什麼部分應該是基於鏈表的? – Dave 2011-12-25 12:13:24

回答

1

的許多問題我發現一個爲結構是,你永遠爲nv

重新分配內存...... 此外,我會用fgets讀取一整行,然後就可以使用strtok,你不得不分配nv,然後設置dbase1到它,所以你建立一個鏈表

+0

我更喜歡fgets,但是我用它的整數參數呢? – joaopfsilva 2011-12-25 12:34:44

+0

第一個參數是指向緩衝區的指針,第二個參數是這個bufffer的大小,它應該對應於最大行長度,可以讀取 – 2011-12-26 17:27:27

1

你需要分配內存nv

在您當前的代碼中,nv是未初始化的指針。你不能像那樣使用它。

你也需要在你的代碼free(nv)並沒有相應nv = malloc(sizeof *nv);或類似

+0

我已經解決了這個問題。告訴我,如果這是正確的: while(fgets(temp,sizeof(temp),fp1)!= NULL) \t nv =(tp *)malloc(sizeof(tp)); \t //使strtok的用於如果結構 \t的每個變種(dbase1 == NULL) \t dbase1 = NV; \t其他 \t無效insert_at_end() \t { \t的printf( 「\ n輸入您在鏈接的列表元素:」); \t的scanf( 「%d」,&info); \t溫度=(NODE *)malloc的(的sizeof(NODE)); \t TEMP-> NUM =信息; \t TEMP->下一= NULL; \t TEMP->分組= NULL; \t如果(頭== NULL) \t { \t頭=溫度; \t第一=溫度; \t最後=溫度; \t} \t別的 \t { (dbase1-> next!= NULL)\t \t { \t dbase1 = dbase1-> next; \t} \t dbase1 - > next = nv; \t nv-> prev = dbase1; \t nv-> next = NULL; \t} \t} – joaopfsilva 2011-12-25 15:14:56

+0

評論區域中的代碼是完全不可讀的。請使用代碼更改編輯您的問題。我在代碼中看到的一件事是函數定義:'void insert_at_end(){/ * ... * /}'不合適。在C中,你不能在其他函數中定義函數。 – pmg 2011-12-25 23:32:28