Page 163 - C-Language
P. 163

longer large enough to fit the whole line. The temporary buffer is then freed when we are done
        with the file.


        Another option is getdelim(). This is the same as getline() except you specify the line ending
        character. This is only necessary if the last character of the line for your file type is not '\n'.
        getline() works even with Windows text files because with the multibyte line ending ("\r\n")'\n'` is
        still the last character on the line.


        Example implementation of getline()


         #include <stdlib.h>
         #include <stdio.h>
         #include <errno.h>
         #include <stdint.h>


         #if !(defined _POSIX_C_SOURCE)
         typedef long int ssize_t;
         #endif

         /* Only include our version of getline() if the POSIX version isn't available. */

         #if !(defined _POSIX_C_SOURCE) || _POSIX_C_SOURCE < 200809L

         #if !(defined SSIZE_MAX)
         #define SSIZE_MAX (SIZE_MAX >> 1)
         #endif

         ssize_t getline(char **pline_buf, size_t *pn, FILE *fin)
         {
           const size_t INITALLOC = 16;
           const size_t ALLOCSTEP = 16;
           size_t num_read = 0;

           /* First check that none of our input pointers are NULL. */
           if ((NULL == pline_buf) || (NULL == pn) || (NULL == fin))
           {
             errno = EINVAL;
             return -1;
           }

           /* If output buffer is NULL, then allocate a buffer. */
           if (NULL == *pline_buf)
           {
             *pline_buf = malloc(INITALLOC);
             if (NULL == *pline_buf)
             {
               /* Can't allocate memory. */
               return -1;
             }
             else
             {
               /* Note how big the buffer is at this time. */
               *pn = INITALLOC;
             }
           }

           /* Step through the file, pulling characters until either a newline or EOF. */



        https://riptutorial.com/                                                                             139
   158   159   160   161   162   163   164   165   166   167   168