最近在做国嵌的mp3项目,在mp3主控程序中用到了这个函数,挺好使的,在这里记录一下。注意是linux下的,不是C++中的。
函数原型
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
所需头文件
#include <stdio.h>
参数
lineptr
字符串,getline函数会给它分配一段空间,用来存储读取出来的行内容
n
整型数字,函数调用完后会把分配的空间大小信息记录在n中。这个参数有些鸡肋,在调用getline之前对它进行任何操作都没什么意义,它只会在调用结束后记录lineptr 空间的大小。
stream
要读取文件的文件流
返回值
成功的话返回读取到行内容的大小,失败的话返回-1。
那废话不多说,直接上测试代码
#include <stdio.h> int main() { FILE *fd; char *lineptr = NULL; //一般对其赋值为空 size_t n = 121; //为了测试将其初值赋为121,其实没什么意义,后面的测试结果可以看出 int num; //记录getline的返回值 fd = fopen("list","r"); if(fd == NULL) //检查打开文件是否成功 { perror("open list"); return 0; } while((num = getline(&lineptr,&n,fd)) != -1) //成功读取的话进入循环 printf("n = %d,num = %d,this line is %s",n,num,lineptr); return 0; }
在给出执行结果前,我们先看看list文件中的内容
这里为了测试,丧心病狂的给第一行输了这么多,可读性什么的先到一边去吧~~
测试结果:
结果分析:
1、可以看到,除了第一行,其余几行的n值都是120。这是因为,linux开始会给lineptr分配一个大小为120的空间,如果够就是这么多,n就等于120了。如果不够,linux会根据这一行的大小重新分配。所以嘛,说n鸡肋是有原因的~
2、忽略第一行,看别的。a r m 3,貌似只有4个字符嘛,为什么num是5?回头看我们的测试代码中的打印函数
printf("n = %d,num = %d,this line is %s",n,num,lineptr);
注意,这里在%s后面并没有加上“\n”换行符,为什么测试结果却出现了换行?相信你们已经猜到了,这一行的内容不仅有arm3这些字符,还有最后面的一个换行符,所以num比我们数到的多了1,就是因为我们没有算上这个看不到的换行符。
3、使用完后,为了避免空间浪费,我们要把分配出的空间free掉
if(lineptr != NULL) { free(lineptr); }
4、关于自动换行,我猜想有一个行指针,每次调用完getline后会自动增加,直到读取完所有的行。不过接触不到内核代码也说不准,暂且先这么认为吧。如果有知道的请不吝赐教。
如果有疑问或错误,欢迎指出。