xref: /freebsd/lib/libc/stdio/fgetln.3 (revision dc36d6f9bb1753f3808552f3afd30eda9a7b206a)
158f0484fSRodney W. Grimes.\" Copyright (c) 1990, 1991, 1993
258f0484fSRodney W. Grimes.\"	The Regents of the University of California.  All rights reserved.
358f0484fSRodney W. Grimes.\"
458f0484fSRodney W. Grimes.\" Redistribution and use in source and binary forms, with or without
558f0484fSRodney W. Grimes.\" modification, are permitted provided that the following conditions
658f0484fSRodney W. Grimes.\" are met:
758f0484fSRodney W. Grimes.\" 1. Redistributions of source code must retain the above copyright
858f0484fSRodney W. Grimes.\"    notice, this list of conditions and the following disclaimer.
958f0484fSRodney W. Grimes.\" 2. Redistributions in binary form must reproduce the above copyright
1058f0484fSRodney W. Grimes.\"    notice, this list of conditions and the following disclaimer in the
1158f0484fSRodney W. Grimes.\"    documentation and/or other materials provided with the distribution.
12fbbd9655SWarner Losh.\" 3. Neither the name of the University nor the names of its contributors
1358f0484fSRodney W. Grimes.\"    may be used to endorse or promote products derived from this software
1458f0484fSRodney W. Grimes.\"    without specific prior written permission.
1558f0484fSRodney W. Grimes.\"
1658f0484fSRodney W. Grimes.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
1758f0484fSRodney W. Grimes.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1858f0484fSRodney W. Grimes.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1958f0484fSRodney W. Grimes.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2058f0484fSRodney W. Grimes.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2158f0484fSRodney W. Grimes.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2258f0484fSRodney W. Grimes.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2358f0484fSRodney W. Grimes.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2458f0484fSRodney W. Grimes.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2558f0484fSRodney W. Grimes.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2658f0484fSRodney W. Grimes.\" SUCH DAMAGE.
2758f0484fSRodney W. Grimes.\"
28*b7d33ccdSGordon Bergling.Dd June 11, 2020
2958f0484fSRodney W. Grimes.Dt FGETLN 3
3058f0484fSRodney W. Grimes.Os
3158f0484fSRodney W. Grimes.Sh NAME
3258f0484fSRodney W. Grimes.Nm fgetln
3358f0484fSRodney W. Grimes.Nd get a line from a stream
3425bb73e0SAlexey Zelkin.Sh LIBRARY
3525bb73e0SAlexey Zelkin.Lb libc
3658f0484fSRodney W. Grimes.Sh SYNOPSIS
3732eef9aeSRuslan Ermilov.In stdio.h
3858f0484fSRodney W. Grimes.Ft char *
3958f0484fSRodney W. Grimes.Fn fgetln "FILE *stream" "size_t *len"
4058f0484fSRodney W. Grimes.Sh DESCRIPTION
4158f0484fSRodney W. GrimesThe
4258f0484fSRodney W. Grimes.Fn fgetln
4358f0484fSRodney W. Grimesfunction
4458f0484fSRodney W. Grimesreturns a pointer to the next line from the stream referenced by
4558f0484fSRodney W. Grimes.Fa stream .
4658f0484fSRodney W. GrimesThis line is
4758f0484fSRodney W. Grimes.Em not
4858f0484fSRodney W. Grimesa C string as it does not end with a terminating
4958f0484fSRodney W. Grimes.Dv NUL
5058f0484fSRodney W. Grimescharacter.
5158f0484fSRodney W. GrimesThe length of the line, including the final newline,
5258f0484fSRodney W. Grimesis stored in the memory location to which
5358f0484fSRodney W. Grimes.Fa len
5458f0484fSRodney W. Grimespoints.
5558f0484fSRodney W. Grimes(Note, however, that if the line is the last
5658f0484fSRodney W. Grimesin a file that does not end in a newline,
5758f0484fSRodney W. Grimesthe returned text will not contain a newline.)
5858f0484fSRodney W. Grimes.Sh RETURN VALUES
5958f0484fSRodney W. GrimesUpon successful completion a pointer is returned;
6058f0484fSRodney W. Grimesthis pointer becomes invalid after the next
6158f0484fSRodney W. Grimes.Tn I/O
6258f0484fSRodney W. Grimesoperation on
6358f0484fSRodney W. Grimes.Fa stream
6458f0484fSRodney W. Grimes(whether successful or not)
6558f0484fSRodney W. Grimesor as soon as the stream is closed.
6658f0484fSRodney W. GrimesOtherwise,
6758f0484fSRodney W. Grimes.Dv NULL
6858f0484fSRodney W. Grimesis returned.
6958f0484fSRodney W. GrimesThe
7058f0484fSRodney W. Grimes.Fn fgetln
7158f0484fSRodney W. Grimesfunction
7258f0484fSRodney W. Grimesdoes not distinguish between end-of-file and error; the routines
7358f0484fSRodney W. Grimes.Xr feof 3
7458f0484fSRodney W. Grimesand
7558f0484fSRodney W. Grimes.Xr ferror 3
7658f0484fSRodney W. Grimesmust be used
7758f0484fSRodney W. Grimesto determine which occurred.
7858f0484fSRodney W. GrimesIf an error occurs, the global variable
7958f0484fSRodney W. Grimes.Va errno
8058f0484fSRodney W. Grimesis set to indicate the error.
8158f0484fSRodney W. GrimesThe end-of-file condition is remembered, even on a terminal, and all
8258f0484fSRodney W. Grimessubsequent attempts to read will return
8358f0484fSRodney W. Grimes.Dv NULL
8458f0484fSRodney W. Grimesuntil the condition is
8558f0484fSRodney W. Grimescleared with
8658f0484fSRodney W. Grimes.Xr clearerr 3 .
8758f0484fSRodney W. Grimes.Pp
8858f0484fSRodney W. GrimesThe text to which the returned pointer points may be modified,
8958f0484fSRodney W. Grimesprovided that no changes are made beyond the returned size.
9058f0484fSRodney W. GrimesThese changes are lost as soon as the pointer becomes invalid.
9158f0484fSRodney W. Grimes.Sh ERRORS
9203fc6303SAlexey Zelkin.Bl -tag -width Er
9358f0484fSRodney W. Grimes.It Bq Er EBADF
9458f0484fSRodney W. GrimesThe argument
9558f0484fSRodney W. Grimes.Fa stream
9658f0484fSRodney W. Grimesis not a stream open for reading.
9720055d76SPedro F. Giffuni.It Bq Er ENOMEM
9820055d76SPedro F. GiffuniThe internal line buffer could not be expanded due to lack of available memory,
9920055d76SPedro F. Giffunior because it would need to expand beyond INT_MAX in size.
10058f0484fSRodney W. Grimes.El
10158f0484fSRodney W. Grimes.Pp
10258f0484fSRodney W. GrimesThe
10358f0484fSRodney W. Grimes.Fn fgetln
10458f0484fSRodney W. Grimesfunction
10558f0484fSRodney W. Grimesmay also fail and set
10658f0484fSRodney W. Grimes.Va errno
10758f0484fSRodney W. Grimesfor any of the errors specified for the routines
10858f0484fSRodney W. Grimes.Xr fflush 3 ,
10958f0484fSRodney W. Grimes.Xr malloc 3 ,
11058f0484fSRodney W. Grimes.Xr read 2 ,
11158f0484fSRodney W. Grimes.Xr stat 2 ,
11258f0484fSRodney W. Grimesor
11358f0484fSRodney W. Grimes.Xr realloc 3 .
11458f0484fSRodney W. Grimes.Sh SEE ALSO
11558f0484fSRodney W. Grimes.Xr ferror 3 ,
11658f0484fSRodney W. Grimes.Xr fgets 3 ,
1172508f480STim J. Robbins.Xr fgetwln 3 ,
11858f0484fSRodney W. Grimes.Xr fopen 3 ,
11969099ba2SDavid Schultz.Xr getline 3 ,
12058f0484fSRodney W. Grimes.Xr putc 3
12158f0484fSRodney W. Grimes.Sh HISTORY
12258f0484fSRodney W. GrimesThe
12358f0484fSRodney W. Grimes.Fn fgetln
1247bdf80e5SMike Pritchardfunction first appeared in
1257bdf80e5SMike Pritchard.Bx 4.4 .
126*b7d33ccdSGordon Bergling.Sh CAVEATS
127*b7d33ccdSGordon BerglingSince the returned buffer is not a C string (it is not NUL terminated), a
128*b7d33ccdSGordon Berglingcommon practice is to replace the newline character with
129*b7d33ccdSGordon Bergling.Sq \e0 .
130*b7d33ccdSGordon BerglingHowever, if the last line in a file does not contain a newline,
131*b7d33ccdSGordon Berglingthe returned text won't contain a newline either.
132*b7d33ccdSGordon BerglingThe following code demonstrates how to deal with this problem by allocating a
133*b7d33ccdSGordon Berglingtemporary buffer:
134*b7d33ccdSGordon Bergling.Bd -literal
135*b7d33ccdSGordon Bergling	char *buf, *lbuf;
136*b7d33ccdSGordon Bergling	size_t len;
137*b7d33ccdSGordon Bergling
138*b7d33ccdSGordon Bergling	lbuf = NULL;
139*b7d33ccdSGordon Bergling	while ((buf = fgetln(fp, &len)) != NULL) {
140*b7d33ccdSGordon Bergling		if (buf[len - 1] == '\en')
141*b7d33ccdSGordon Bergling			buf[len - 1] = '\e0';
142*b7d33ccdSGordon Bergling		else {
143*b7d33ccdSGordon Bergling			/* EOF without EOL, copy and add the NUL */
144*b7d33ccdSGordon Bergling			if ((lbuf = malloc(len + 1)) == NULL)
145*b7d33ccdSGordon Bergling				err(1, NULL);
146*b7d33ccdSGordon Bergling			memcpy(lbuf, buf, len);
147*b7d33ccdSGordon Bergling			lbuf[len] = '\e0';
148*b7d33ccdSGordon Bergling			buf = lbuf;
149*b7d33ccdSGordon Bergling		}
150*b7d33ccdSGordon Bergling		printf("%s\en", buf);
151*b7d33ccdSGordon Bergling	}
152*b7d33ccdSGordon Bergling	free(lbuf);
153*b7d33ccdSGordon Bergling	if (ferror(fp))
154*b7d33ccdSGordon Bergling		err(1, "fgetln");
155*b7d33ccdSGordon Bergling.Ed
156