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

Jos*_*rad 2 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函数?

Jon*_*ler 8

  1. 使用120作为初始分配是编写图书馆的人的明智选择; 它比大多数线都长,所以有一个很好的机会它只需要进行一次内存分配.(FWIW:我在标准库中没有版本的机器上编写getline()getdelim()使用它的实现.它使用256作为最小分配(而不是120) - 除非编译用于测试,当它使用8作为起点时确保重新分配代码得到更多的练习.当没有足够的空间时,分配的大小加倍.这是一个类似于图书馆设计师在你使用的库中所做的思考过程;第一次在代码周围获得足够大的内存分配大部分都不需要重新分配.)
  2. 您可以在库中找到代码,更改默认值并重建库.OTOH,这很辛苦.
  3. 这里有一个函数getline()可以告诉你它刚刚通过返回值读取的行中有多少个字符.请注意,它在出错时返回-1(不是EOF).尽管很少发生,但理论上EOF可能是-1以外的负值.

您还可以通过以下方式安装系统以使用较短的行(直到您阅读长行):

FILE *file_in;
size_t len = 16;
char *line = malloc(len);
Run Code Online (Sandbox Code Playgroud)

而且(对于最终的sleazeball编程)你甚至不必错误检查分配,因为char *line = NULL;它也是一个有效的输入getline():

ssize_t nbytes;

while ((nbytes = getline(&line, &len, file_in)) > 0)
    ...process a line of nbytes including newline...
Run Code Online (Sandbox Code Playgroud)


Cha*_*rns 6

getline() 将根据需要扩展lenline重新分配以适应读取的任何输入。

您可能还没有看到line> 120。

要获取读取的行的长度,您可以使用返回值或 strlen : int num_chars = strlen(line);

使用 getline 的最简单方法是这样的:

size_t len = 0;
char *line = 0;

while(...) {
    size_t n = get_line(&line, &len, file);
    // n is the number of chars in line, len is the total size of the line buffer.
}
Run Code Online (Sandbox Code Playgroud)

getline()将改变linelen根据需要。

*最重要的是,阅读getline联机帮助页。*