2011-12-25 123 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