c - getline() 函数中的行长 - c

标签 c

我有一个关于函数 getline() 的问题:

getline(&line, &len, file_in);



其中 file_in 是:

FILE *file_in;

char *line = NULL;

size_t len;



每次读取任何一行时,分配的内存(len 变量)都是 120
我想它是常量,因为它是文件中的默认行大小。

1) 但为什么是 120

2)可以在任何地方更改此默认大小吗?

3) 是否有任何只计算写入字符的 C 函数?

最佳答案

  • 使用 120 作为初始分配是编写库的人做出的明智选择;它比大多数行都长,因此很有可能它只需要进行一次内存分配。 (FWIW:我编写了一个 getline()getdelim() 的实现,用于在没有标准库版本的机器上使用。它使用 256 作为最小分配(而不是 120)——除非编译用于测试,当它使用 8 作为起点以确保重新分配代码得到更多的练习。当没有足够的空间时,分配的大小加倍。这与库设计者在您使用的库中所做的思考过程类似;第一次让内存分配足够大代码大多不需要重新分配。)
  • 可以在库中找到代码,更改默认值,重建库。 OTOH,那是艰苦的工作。
  • 有一个名为 getline() 的函数,它告诉您它刚刚通过返回值读取的行中有多少个字符。请注意,它在出错时返回 -1(不是 EOF)。虽然这种情况很少发生,但理论上 EOF 可能是 -1 以外的负值。

  • 您还可以通过以下方式操纵系统使用较短的行(直到您阅读长行):
    FILE *file_in;
    size_t len = 16;
    char *line = malloc(len);
    

    并且(对于 sleazeball 编程的终极目标)您甚至不必错误检查分配,因为 char *line = NULL; 也是 getline() 的有效输入:
    ssize_t nbytes;
    
    while ((nbytes = getline(&line, &len, file_in)) > 0)
        ...process a line of nbytes including newline...
    

    关于c - getline() 函数中的行长 - c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20036074/

    相关文章:

    c - 32位浮点除法并没有我想象的那么慢

    c - C 中的递归下降解析器 - 跳过 epsilon 产生式

    c - 如何打印 uint8_t 字节数组?

    c++ - 从 C 调用系统 C++ 函数

    c - 将线性方程的系数从文件读取到c中的二维数组中

    c - 有没有办法在运行时确定可用的堆栈空间?

    c - 使用 CTRL+C 终止程序后运行某些内容

    C图。无法将边添加到邻接表中

    c - 使用 C 解析 MIDI 文件 -(分配内存时可能出现问题)

    c - 在 C 中修剪 int 数组以进行桶排序