c - 使用 fgets 从文件中读取一行

标签 c file-io

本应如此简单的东西却让我感到难过。我所做的只是编写一个 getLine 方法,该方法应将一行读入缓冲区。我从 10 字节 开始为缓冲区分配内存,然后将 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 的返回值

作为无耻的 self 推销,here's a function I posted in another answer .

关于c - 使用 fgets 从文件中读取一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14641851/

相关文章:

c - 替换二进制文件中的字符串

c++ - 解析C头文件生成文件

python - 将包含python列表的文本文档读入python程序

java - 无法打印从txt文件读取的数组

c++ - 有没有办法读取 C++ 中的文件文件夹?

c - Sedona 中的原生 C 方法 - 间接级别

c - 如何在 Xamarin Android 中隐藏/关闭软键盘?

c - 当使用更多迭代时,C 中的 asin() 函数返回 NaN

java - 当 File.listFiles 返回 null 时检索底层错误

c - c 中的简单字符串列表正在泄漏内存(malloc 和 realloc)