Based on the getline of function in depth understanding

  • 2020-04-02 00:47:25
  • OfStack

I searched getline() function on the Internet for a long time, mostly for C++, the overloaded function is more, the cloud in the fog, and there is no instance, anyway, there is no need for their own getline() function. So, oneself under Linux man a, and did the test. The getline() function gets the line information from the file, one line at a time.

Because the purpose of using the getline() function is to get the local network card information, that is, the eth0 information, to determine whether the network line was checked when starting the machine (could have been done from the driver, but the application layer can handle, do not want to do more processing, understanding).

// function prototype
# 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] # The cat dev
Intel - |     The Receive                                                                                               | the Transmit
  Face | bytes     Packets errs drop fifo frame and multicast|bytes       Packets errs drop fifo colls carrierpackets
    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] # The 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)))//Read the line information and 'n' is the newline flag
    {
        pstr = strstr(line, "eth0");//Find whether there is an "eth0" string in the changed line
        if(NULL != pstr)
        {
   //printf("%sn", pstr);
   sscanf(pstr, "%st%st%s", buf1, buf2, buf3);
   printf("buf1:%s  buf2:%s  buf3:%sn", buf1, buf2, buf3);
   break;
        }
    }
    //Make sure the space is free
    if(line)
    {
        free(line);
    }
    fclose(fp);
 return 0;
}

[root @ localhost for_test] # GCC eth0_dev. C
[root @ localhost for_test] # . / a.out
Buf1: eth0:   Buf3 buf2:53311: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.


Related articles: