0

什么应该是难以置信的简单让我难住了。我所做的只是编写一个getLine应该将一行读入缓冲区的方法。我从 开始将内存分配给缓冲区10 bytes,然后分配给fgetschar 数组。这个想法是我一遍又一遍地尝试这个,将缓冲区的大小加倍,直到它得到整行。但是,我似乎观察到的是它读取了该行的一部分,然后在下一次尝试中继续在上次尝试时空间不足的地方,因此它给出了该行的最后一部分。任何关于错误的见解,我希望我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
4

3 回答 3

4

有多个缺陷:

  • sizeof *buffer不做你想做的事,因为它是一个指针。你应该buffSiz改用

  • char *buffer = newBuf;您将新内存分配给局部变量,即else退出时消失的变量

  • 您没有将缓冲区传递给realloc,您总是在传递NULL

  • 你没有检查退货realloc

作为一个无耻的自我推销,这是我在另一个答案中发布的一个功能

于 2013-02-01T07:51:51.183 回答
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 */
}

注意:以上代码是在浏览器中编写的,未经测试,可能需要一些调整才能使其正常工作。

于 2013-02-01T07:53:02.987 回答
1

realloc期望需要重新分配的缓冲区作为其第一个参数。

realloc(*buffer, buffSiz);
于 2013-02-01T07:54:03.300 回答