getline()函数 (一)

2014-11-24 03:01:52 · 作者: · 浏览: 4

我在网上搜了半天getline()函数,大多针对C++的,重载函数比较多,云里雾里的,而且没有实例,反正就是没有自己所需要的getline()函数。所以,自己在Linux下man了一把,并做了测试。getline()函数的功能是从文件中获取行信息,即每次读取一行信息。

因为我使用getline()函数的目的是获取本地网卡信息,即eth0的信息,从而判断启动机子时是否查了网线(本来可以从驱动里做,但应用层可以搞定,就不想多做处理了,谅解)。

//函数原型

#define _GNU_SOURCE

#include

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE*stream);

[root@localhost for_test]# cat dev

Inter-| Receive | Transmit

face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carriercompressed

lo: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

eth0: 53311 230 0 0 0 0 0 0 5370 33 0 0 0 0 0 0

[root@localhost for_test]# cat eth0_dev.c

[cpp]
#include
#include

int main(void)
{
FILE *fp = NULL;
int cnt = -1;
int len = 0;
char buf1[16] = {0}, buf2[16] = {0}, buf3[16] = {0};
char *line = NULL;
char *pstr = NULL;
fp = fopen("./dev", "rb");
if(NULL == fp)
{
printf("open /proc/net/dev err!\n");
return -1;
}
while(-1 != (cnt = getline(&line, &len, fp)))//读取行信息,'\n'为换行标志
{
pstr = strstr(line, "eth0");//查找改行中是否有"eth0"的字符串
if(NULL != pstr)
{
//printf("%s\n", pstr);
sscanf(pstr, "%s\t%s\t%s", buf1, buf2, buf3);
printf("buf1:%s buf2:%s buf3:%s\n", buf1, buf2, buf3);
break;
}
}
//确保空间的释放
if(line)
{
free(line);
}
fclose(fp);
return 0;
}

#include
#include

int main(void)
{
FILE *fp = NULL;
int cnt = -1;
int len = 0;
char buf1[16] = {0}, buf2[16] = {0}, buf3[16] = {0};
char *line = NULL;
char *pstr = NULL;
fp = fopen("./dev", "rb");
if(NULL == fp)
{
printf("open /proc/net/dev err!\n");
return -1;
}
while(-1 != (cnt = getline(&line, &len, fp)))//读取行信息,'\n'为换行标志
{
pstr = strstr(line, "eth0");//查找改行中是否有"eth0"的字符串
if(NULL != pstr)
{
//printf("%s\n", pstr);
sscanf(pstr, "%s\t%s\t%s", buf1, buf2, buf3);
printf("buf1:%s buf2:%s buf3:%s\n", buf1, buf2, buf3);
break;
}
}
//确保空间的释放
if(line)
{
free(line);
}
fclose(fp);
return 0;
}


[root@localhost for_test]#gcc eth0_dev.c

[root@localhost for_test]# ./a.out

buf1:eth0: buf2:53311 buf3:230


[root@localhost for_test]# man getline

[cpp]
DESCRIPTION
getline() reads an entire line from stream, storing the address of the buffer containing the text into *lineptr. The buffer is null-
terminated and includes the newline character, if one was found.

If *lineptr is NULL, then getline() will allocate a buffer for storing the line, which should be freed by the user program. Alterna-
tively, before calling getline(), *lineptr can contain a pointer to a malloc()-allocated buffer *n bytes in size. If the buffer is not
large enough to hold the line, getline() resizes it with realloc(), updating *lineptr and *n as necessary. In either case, on a suc-
cessful call, *lineptr and *n will be updated to reflect the buffer address and allocated size respectively.

getdelim() works like getline(), except a