[英]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.