我有一个关于函数getline()的问题:
getline(&line,&len,file_in);
其中file_in是:
FILE*file_in;
char*line = NULL;
size_t len;
每当我读取任何行时,分配的内存(len变量)就是120
我认为它是常量,因为它是文件中的默认行大小.
1)但为什么120呢?
2)可以在任何地方更改此默认大小吗?
3)是否有任何只计算书面字符的C函数?
getline()并getdelim()使用它的实现.它使用256作为最小分配(而不是120) - 除非编译用于测试,当它使用8作为起点时确保重新分配代码得到更多的练习.当没有足够的空间时,分配的大小加倍.这是一个类似于图书馆设计师在你使用的库中所做的思考过程;第一次在代码周围获得足够大的内存分配大部分都不需要重新分配.)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)
getline() 将根据需要扩展len和line重新分配以适应读取的任何输入。
您可能还没有看到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()将改变line并len根据需要。
*最重要的是,阅读getline联机帮助页。*