2013-11-14 48 views
1

我試圖把文件的行數組的索引並把他們一個字符串數組的唯一索引這樣:Ç以文件的行並把他們分隔字符串

char *fileString[newline_count]; 
     rewind(makeFile); 
     int i; 
     int i2 = 0; 
     int i3 = 0; 
     char temp[500]; 
     for(i = 0; i < string_size; i++){ 
      temp[i3] = fgetc(makeFile); 
      if(temp[i3] == '\n'){ 
       temp[i3] = '\0'; 
       fileString[i2] = temp; 
       i2++; 
       i3 = 0; 
      }else{ 
       i3++; 
      } 
     } 

     for(i = 0; i < newline_count; i++){ 
      printf("%s %c", fileString[i], '\n'); 
     } 

最後一個for循環僅打印出字符串數組fileString的內容。我是第一個for循環的索引,i2是fileString的索引,而i3是臨時char的索引,一旦一行的內容被放入temp,它將被存儲到fileString中。 我想知道爲什麼fileString的內容是最後一行的 一遍又一遍。最後一個for循環僅顯示文件最後一行的文件內容。我完全失去了,非常非常累,所以我在這裏尋求幫助。我非常感謝它。

回答

1

在每次迭代中,將緩衝器temp分配給fileString中的每個位置。換句話說,數組中的所有條目指向相同的緩衝區(其中包含最後讀取的最後一行)。

「快速」解決將是該行更改爲:

fileString[i2] = strdup(temp); 

如果你這樣做,你需要釋放每個條目,以避免泄漏。

1

您正在爲fileString的每個索引分配temp;這會導致fileString的每個元素指向相同的東西 - temp數組的第一個元素。由於您使用每一行都覆蓋temp的內容,因此讀完文件後最終只包含最後一行。

你需要複製的temp別的地方(也是唯一的)內容給他們,並指向fileString保持到副本,而不是臨時temp陣列。例如,malloc讀取每行後有足夠長度的新存儲器,並且strcpytemp到該位置的行(您必須使用free完成後)。一種快速方法是使用strdup,它與mallocstrcpy的組合基本相同,但是是非標準功能(因此,如果沒有其他操作,請實施您自己的strdup)。

1

閱讀每個單獨的字符並將其放入字符串中是不必要的。使用fgets()。我會爲每行分配內存,獲取數據,然後在某些數據結構中存儲指向分配數據的指針。

例如,

// Allocate an array pointers, using 1000 as our initial size. 
    int lineReferencesSize = 1000; 
    char **lineReferences = (char **) malloc (sizeof(char *) * lineReferencesSize); 
    char buf[100]; 

    int i = 0; 
    while(fgets(buf, 100, fin)) { 
    lineReferences[i] = strdup(buf); 
    i++; 
    } 

記得給free()時,即可大功告成。

現在,lineReferences是一個固定大小的指針數組,可存儲1000個char *指針。出於嚴肅的目的,我會考慮一個沒有任意固定大小的數據結構。您可以通過將lineReferences設置爲一個動態數組,在您達到限制時重新調整大小,重新分配()以使數量增加一倍,然後繼續前進。有一些有趣的邊緣案例需要考慮(閱讀realloc的手冊頁)。

您也可以寫這樣的還有:

// Allocate an array pointers, using 1000 as our initial size. 
    char *lineReferences[1000]; 
    char buf[100]; 

    int i = 0; 
    while(fgets(buf, 100, fin)) { 
    lineReferences[i] = strdup(buf); 
    i++; 
    } 

但要明白髮生了什麼事情與其他形式是很重要的。