原文地址:http://blog.csdn.net/huangblog/article/details/8807033
我在网上搜了半天getline()函数,大多针对C++的,重载函数比较多,云里雾里的,而且没有实例,反正就是没有自己所需要的getline()函数。所以,自己在Linux下man了一把,并做了测试。getline()函数的功能是从文件中获取行信息,即每次读取一行信息。
因为我使用getline()函数的目的是获取本地网卡信息,即eth0的信息,从而判断启动机子时是否查了网线(本来可以从驱动里做,但应用层可以搞定,就不想多做处理了,谅解)。
//函数原型
#define _GNU_SOURCE
#include <stdio.h>
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
- #include <stdio.h>
- #include <string.h>
- 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]# ./a.out
buf1:eth0: buf2:53311 buf3:230
[root@localhost for_test]# man getline
- 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 line delimiter other than newline can be specified as the delimiter argument. As with get-
- line(), a delimiter character is not added if one was not present in the input before end of file was reached.
- RETURN VALUE
- On success, getline() and getdelim() return the number of characters read, including the delimiter character, but not including the
- terminating null byte. This value can be used to handle embedded null bytes in the line read.
- Both functions return -1 on failure to read a line (including end of file condition).
- ERRORS
- EINVAL Bad parameters (n or lineptr is NULL, or stream is not valid).
- EXAMPLE
- #define _GNU_SOURCE
- #include <stdio.h>
- #include <stdlib.h>
- int main(void)
- {
- FILE * fp;
- char * line = NULL;
- size_t len = 0;
- ssize_t read;
- fp = fopen("/etc/motd", "r");
- if (fp == NULL)
- exit(EXIT_FAILURE);
- while ((read = getline(&line, &len, fp)) != -1) {
- printf("Retrieved line of length %zu :\n", read);
- printf("%s", line);
- }
- if (line)
- free(line);
- return EXIT_SUCCESS;
- }
- CONFORMING TO
- Both getline() and getdelim() are GNU extensions. They are available since libc 4.6.27.