Linux下的getline函数
最近在做国嵌的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,其实没什么意义,后面的测试结果可以看出
int num; //记录getline的返回值
fd = fopen("list","r"); if(fd == NULL) //检查打开文件是否成功
{
perror("open list");
return ;
} while((num = getline(&lineptr,&n,fd)) != -) //成功读取的话进入循环
printf("n = %d,num = %d,this line is %s",n,num,lineptr); return ;
}
在给出执行结果前,我们先看看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后会自动增加,直到读取完所有的行。不过接触不到内核代码也说不准,暂且先这么认为吧。如果有知道的请不吝赐教。
如果有疑问或错误,欢迎指出。
Linux下的getline函数的更多相关文章
- Linux下利用ioctl函数获取网卡信息
linux下的ioctl函数原型如下: #include <sys/ioctl.h> int ioctl(int handle, int cmd, [int *argc, int argv ...
- 【C/C++】Linux下使用system()函数一定要谨慎
[C/C++]Linux下使用system()函数一定要谨慎 http://my.oschina.net/renhc/blog/53580 曾经的曾经,被system()函数折磨过,之所以这样,是因为 ...
- Linux下系统时间函数、DST等相关问题总结(转)
Linux下系统时间函数.DST等相关问题总结 下面这个结构体存储了跟时区相关的位移量(offset)以及是否存在DST等信息,根据所在的时区信息,很容易找到系统时间与UTC时间之间的时区偏移,另外根 ...
- 【转】在嵌入式Linux和PC机Linux下使用popen函数时,程序运行结果有差异。
下面程序演示了在嵌入式Linux和PC机Linux下使用popen函数时,程序的运行结果是有差异的. 两个程序 atest.c 和 btest.c,atest 检查是否有 btest 进程运行,如果没 ...
- linux下实现rm()函数删除文件或目录
转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600866.html 在linux下有两个函数可以用来删除文件: #include <unistd.h ...
- linux下实现ls()函数遍历目录
转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600794.html 需求:在linux下遍历目录,输出目录中各文件名. 在linux下遍历目录的相关函数有 ...
- Linux下clock计时函数学习【转】
转自:https://www.cnblogs.com/wfwenchao/p/5195022.html 平时在Linux和Winows下都有编码的时候,移植代码的时候免不了发现一些问题.1. 你到底准 ...
- Linux下clock计时函数学习
平时在Linux和Winows下都有编码的时候,移植代码的时候免不了发现一些问题.1. 你到底准不准?关于clock()计时函数首先是一段简单的测试代码,功能为测试从文本文件读取数据并赋值给向量最后打 ...
- Linux下利用signal函数处理ctrl+c等信号
前言 linux下能够通过信号机制来实现程序的软中断,是一个很实用的编程方法. 我们平时在程序执行的时候按下ctrl-c.ctrl-z或者kill一个进程的时候事实上都等效于向这个进程发送了一个特定信 ...
随机推荐
- 数据的存储-NSKeyedArchiver和write to file介绍
数据的存储-NSKeyedArchiver和write to file介绍 首先介绍各个文件的作用-->讲解文件位置的查找方法-->介绍数据存储的方式:1.使用归档方式存储数据 2.wri ...
- Android之发送短信的两种方式
SMS涉及的主要类SmsManager 实现SMS主要用到SmsManager类,该类继承自java.lang.Object类,下面我们介绍一下该类的主要成员. 公有方法: ArrayList< ...
- TCP/IP协议原理与应用笔记06:OSI参考模型全称
1. ISO是一个组织,OSI是一个模型. 2. OSI不是协议,是网络体系结构的概念模型 3. OSI参考模型全称为: Open System Interconnection Reference M ...
- css.day.05.eg
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- chrome浏览的下载扩展程序
C:\Users\XXXX\AppData\Local\Google\Chrome\User Data\Default\Extensions 地址栏输入chrome://extensions/并回车打 ...
- Hibernate HQL查询:
Hibernate HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查 ...
- NPM环境搭建
1. NPM全局路径:配置npm包的安装位置,在你的用户文件夹下,新建.npmrc文件:cache=D:\NodeJs\nvm\npm-cache 表示缓存文件夹 prefix=D:\NodeJs\n ...
- UVA 10285 - Longest Run on a Snowboard (记忆化搜索+dp)
Longest Run on a Snowboard Input: standard input Output: standard output Time Limit: 5 seconds Memor ...
- 交叉编译:cannot find /lib/libc.so.6 collect2: ld returned 1 exit status
1.有时候明明指定了交叉编译的动态库搜索路径,但有些库提示还是搜索不到,而且提示的搜索路径有点奇怪,不是指定的路径,比如: /opt/mips-4.4/bin/../lib/gcc/mips-linu ...
- JavaScript 目标装配式编程(Target Assemble Programming)
TAP概述 脚本中一切皆对象,若还以传统模式思考编程模式,那简直是对不起脚本解释器的强大支持:我们应该以最接近人类操作方式的来表达人的意图. 更接近工作实践的方式,比如游戏中,一个人物一个角色,人物的 ...