2013-02-01 40 views
0

難以置信的簡單應該讓我難住。我所做的只是編寫一個getLine方法,該方法應該將一行讀入緩衝區。我將內存分配給開始於10 bytes的緩衝區,然後將fgets分配到char數組中。我的想法是,我一遍又一遍地嘗試,將緩衝區的大小加倍,直到獲得整個行。然而,我似乎正在觀察的是它讀取了一行的一部分,然後在下一次嘗試繼續它在最後一次嘗試時跑出房間,因此它給出了該行的最後一部分。任何洞察它到什麼是錯誤的,我期望與我的realloc內存緩衝區,將不勝感激。使用fgets從文件讀取一條線

char * mygetline(char **buffer, FILE * infile) 
{ 
    int buffSiz = 10; 
    *buffer = calloc(buffSiz, 1); 
    do 
    { 
     char * result = fgets(*buffer, sizeof *buffer ,infile); 
     if(result == NULL) 
     { 
      free(buffer); 
      return NULL; 
     } 

     if(strchr(*buffer, '\n')) 
      return *buffer; 
     else 
     { 
      char *newBuf; 
      buffSiz = buffSiz*2; 
      newBuf = realloc(NULL, buffSiz); 
      char *buffer = newBuf; 
      printf("%d", buffSiz); 
      printf("%s", *buffer); 
     } 
    } while (1); // INFINITE LOOP - WE ONLY GET OUT BY RETURNING FROM WITHIN 
+1

我認爲這個想法是,你realloc舊緩衝區(舊數據自動複製),然後繼續閱讀到(現在更大)的緩衝區。 – hyde

回答

3

這就是文件功能的工作原理。您必須在開始時獲取文件位置,然後在每次嘗試新讀取時重置位置。

您可以使用ftell函數獲取當前位置,然後使用fseek函數設置位置。


而是這樣做(讓位置,不斷重新定位文件位置),爲什麼不使用realloc重新分配在緩衝區中傳遞的事實和內容與事實讀取功能讀取下一個部分保持在一起?在這種情況下,你需要一個指向下一個閱讀位置的指針,如果沒有新行,那麼只需重新分配並提前指針?

事情是這樣的:

char *readpos = *buffer; 
size_t readsize = bufSize; 

while (1) 
{ 
    char *p = fgets(readpos, readsize, infile); 
    if (!p) 
     break; /* Error */ 

    /* Search from the end, as there's where the newline should be */ 
    if (strrchr(p, '\n') != NULL) 
     return *buffer; /* Found the newline */ 

    /* Need to allocate more memory */ 
    bufSize += bufsize; 
    *buffer = realloc(*buffer, bufSize); 

    /* Set the pointer to next position to read into */ 
    readpos = *buffer + strlen(buffer); 

    /* Loop takes case of trying again */ 
} 

注:上面的代碼寫在瀏覽器中,沒有經過測試,並可能需要一些調整,以使其正常工作。

4

有多種缺陷:

  • sizeof *buffer你想要的東西,因爲它是一個指針沒有做。您應該使用buffSiz代替

  • 你分配新的內存局部變量char *buffer = newBuf;,即當else退出

  • 你不通過你的緩衝區realloc那消失的變量,你」再經過總NULL

  • 你不檢查的收益realloc

作爲無恥的自我推銷,here's a function I posted in another answer

1

realloc預計需要重新分配的緩衝區作爲其第一個參數。

realloc(*buffer, buffSiz); 
+0

不是真的,如果第一個參數是NULL,它表現爲malloc。 –

+1

是的,這意味着他在函數中有大量的內存泄漏。 – LtWorf