簡體   English   中英

使用fgets從文件讀取一行

[英]Reading a Line From File using fgets

讓我感到難過的是簡單的事情。 我正在做的是編寫一個getLine方法,該方法應將一行讀入緩沖區。 我從10 bytes開始向緩沖區分配內存,然后將fgets放入char數組。 我的想法是,我一遍又一遍地嘗試,使緩沖區的大小加倍,直到獲得整行。 但是,我似乎正在觀察的是,它讀取了行的一部分,然后在下一次嘗試時繼續進行,直到上一次嘗試它在空間不足的地方,所以它給出了行的最后一部分。 任何了解它什么是錯的,我跟我的預期realloc內存緩沖區,將不勝感激。

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

有多個缺陷:

  • sizeof *buffer不能執行您想要的操作,因為它是一個指針。 您應該改用buffSiz

  • char *buffer = newBuf; 您正在將新內存分配給局部變量,即,一個變量在退出else時消失

  • 您沒有將緩沖區傳遞給realloc ,而是始終傳遞NULL

  • 您沒有檢查realloc的返回

作為無恥的自我推廣, 這是我在另一個答案中發布的功能

這就是文件功能的工作方式。 您必須從頭開始獲取文件位置,然后在每次嘗試進行新的讀取時重置該位置。

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


而不是這樣做(獲取位置並恆定地重新定位文件位置),為什么不使用realloc重新分配傳入的緩沖區並保留內容以及read函數讀取下一部分的事實呢? 在這種情況下,您需要有一個指向下一個要讀取的位置的指針,如果沒有換行符,那么只需重新分配並前進該指針?

像這樣:

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 */
}

注意:上面的代碼是在瀏覽器中編寫的,未經測試,可能需要進行一些調整才能使其正常運行。

realloc期望將需要重新分配的緩沖區作為其第一個參數。

realloc(*buffer, buffSiz);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM