2013-03-03 127 views
2

我想在C中寫一個函數,它從文件中讀取一些用逗號分隔的值,每行有4個值,最後一個是整數,我想把它們放入一個分配的空間。當我試圖從while循環中的內存中讀取它們時,它們都很好,但是從for循環或從函數外部,我只是在文件的最後一行多次讀取文件的最後一行,因此在某些情況下會錯過某些字符。我是C新手,但我認爲它與strtok()功能有關。c中的結構數組

這裏是我的代碼:

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

    typedef struct { 
     char * foo; 
     char * bar; 
     char * baz; 
     int qux; 
    }structure; 

    char * readFile(const char * filename, structure * array){ 
     const int maxstring=100; 
     FILE * fr=fopen(filename,"r"); 
     char * rc; 
     char buf[maxstring]; 
     while((rc = fgets(buf, maxstring, fr))) { 
      array->foo=strtok (buf,","); 
      array->bar=strtok (NULL,","); 
      char *aux=strtok (NULL,","); 
      array->qux=atol(strtok (buf,",")); 
      array->baz=strtok(aux,"\n"); 
      printf("%s,%s,%s,%d\n",array->foo,array->bar, 
      array->baz,array->qux); 
      array++; 
     } 
     array=array-9; 
     for (int i=0;i<10;i++){ 
      printf("%s,%s,%s,%d\n",array->foo,array->bar, 
      array->baz,array->qux); 
      array++; 
     } 
     return "Success"; 
    } 


    int main(){ 
     structure * array=malloc(100*sizeof(structure)); 
     readFile("repository.txt",array); 
     free(array); 
     return 0; 
    } 

回答

5

的問題是你存儲通過strtok返回指針。功能strtok返回指針在原緩衝區的內存中,也就是buf內的指針。並且您在每次迭代時都覆蓋buf(通過fgets)。

來解決這個問題最簡單的方法是通過strdup返回strotk值:

char * p = strtok (buf,","); 
if (p) 
    array->foo = strdup(p); 

你也一樣要存儲其他的東西。當你完成它們時,請不要忘記撥打free

+0

如果數據結束後文件中有東西,最後也可能會重複最後一行。事實上,你至少會得到一個重複,因爲在最後的 \ n它會返回一行,你會再次調用它,它會返回一個零長度的行(這看起來很像你以前的行)在buf中行),只有當你再次調用它時,它纔會有EOF。 – 2013-03-03 21:51:17

+0

@NeilTownsend很好的觀察,從來沒有想到這一點。 – cnicutar 2013-03-03 21:53:56

+0

謝謝你:-)但你的答案涉及到根本問題,我認爲這是一個非常有洞察力的問題。 – 2013-03-03 21:59:20