c - C 中的动态缓冲区 fgets

标签 c dynamic-memory-allocation fgets

我一直在搜索如何使用 fgets 分配动态缓冲区,但我似乎无法在这个示例中找到它。该文件有两个未知长度的数字,由空格分隔。对于每一行,它读取每个字符,直到 ' '\n 并打印出来。

char *ptr;
char line[MAX];

while(fgets(line, sizeof line , fp) != NULL){
     ptr = line;
     for(i=0; i<2; i++){
        while(*ptr && (*ptr) != ' '){     
             if(*ptr == ' ')
                break;   
             k = (*ptr) - '0';
             if(k != -38)    // wont print '\n'
                printf("%d", k);            
             ptr++;
        }
       while(*ptr && (*ptr) != '\n') {
             if(*ptr == ' '){
                ptr++;
                continue;
             }      
             k = (*ptr) - '0';
             printf("%d", k);       
             ptr++;
     }
   }
}

Can someone give me an idea on how to make line dynamic while still using ptr that way?

最佳答案

我想你想要的是这样的:

size_t linelen = 80;
char *line = malloc(linelen);

while(magic_reallocating_fgets(&line, &linelen, fp) != NULL) {
    /* ... do whatever you want with line ... */
}

但是,当然,64,000 美元的问题是,magic_reallocating_fgets 是什么样子的?它是这样的:

char *magic_reallocating_fgets(char **bufp, size_t *sizep, FILE *fp) {
    size_t len;
    if(fgets(*bufp, *sizep, fp) == NULL) return NULL;
    len = strlen(*bufp);
    while(strchr(*bufp, '\n') == NULL) {
        *sizep += 100;
        *bufp = realloc(*bufp, *sizep);
        if(fgets(*bufp + len, *sizep - len, fp) == NULL) return *bufp;
        len += strlen(*bufp + len);
    }
    return *bufp;
}

那不是真正完整的代码,它几乎是伪代码。我给你留了两件事作为练习:

它没有对 mallocrealloc 调用进行错误检查。

它的效率非常低,因为它在读取的每一行上都进行两次额外的传递:计算字符数,然后再次查找 '\n'。 (事实证明,fgets 的界面不适合此类工作。)

关于c - C 中的动态缓冲区 fgets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37124003/

相关文章:

c - 当我多次运行程序时如何使用或释放​​动态分配的内存?

c++ - 使用 std::allocator 解除分配

c - fgets() 不会将文件内容读取到二维数组

c - scanf 之后 fgets 不起作用

c - 返回平均值、最大值、最小值的 Void 函数,并以数组和输入数量作为参数

c - 使用标准输入时等待 EOF

c - 无法将字符串写入 *char[]

c - fgets 的意外结果

c - 编译器在c中分配垃圾值的贡献

c - C中不可复制的结构?