Since the returned buffer is not a C string (it is not NUL terminated), a
common practice is to replace the newline character with
'\0'.
However, if the last line in a file does not contain a newline,
the returned text won't contain a newline either.
The following code demonstrates how to deal with this problem by allocating a
temporary buffer:
char *buf, *lbuf;
size_t len;
lbuf = NULL;
while ((buf = fgetln(fp, &len)) != NULL) {
if (buf[len - 1] == '\n')
buf[len - 1] = '\0';
else {
/* EOF without EOL, copy and add the NUL */
if ((lbuf = malloc(len + 1)) == NULL)
err(1, NULL);
memcpy(lbuf, buf, len);
lbuf[len] = '\0';
buf = lbuf;
}
printf("%s\n", buf);
}
free(lbuf);
if (ferror(fp))
err(1, "fgetln");