?
Nein, das ist ursprünglich eine GNU-Erweiterung und neuerdings in POSIX.1-2008 enthalten (was bedeutet, dass innerhalb einiger Jahre jedes System außer Windows sie beherrschen wird). Sie funktioniert im Grunde ähnlich wie fgets, fordert aber selbst ausreichend Speicher an, um die ganze Zeile darin zu verstauen.
Wenn du weißt, wie lang eine Zeile in der Datei maximal werden kann, tut's auch fgets mit ausreichend großem Buffer. Ist das nicht der Fall und bist du an ANSI-C gebunden, lässt sich getline relativ leicht mit fgets und realloc nachschreiben. Beispielsweise:
char *get_line(FILE *stream) {
size_t const CHUNKSIZE = 128;
size_t n = 0;
char *buf = NULL;
if(feof(stream)) return NULL;
do {
char *p;
/* Buffer vergrößern */
n += CHUNKSIZE;
p = realloc(buf, n + 1);
if(p == NULL) {
free(buf);
return NULL;
}
buf = p;
/* Nächsten Block anfordern */
if(fgets(buf + n - CHUNKSIZE, CHUNKSIZE + 1, stream) == NULL) {
/* Für den Fall, dass die Datei nicht mit einem Newline-Zeichen endet */
if(feof(stream)) {
return buf;
} else {
free(buf);
return NULL;
}
}
/* Solange, bis die Zeile vollständig ist. */
} while(buf[strlen(buf) - 1] != '\n');
return buf;
}
In der Benutzung dann etwa
char *line;
while(line = get_line(fd)) {
printf("%g\n", line_avg(line));
free(p);
}
Das ist jetzt nicht so performant wie getline, weil der Heap stärker bemüht wird und ich das nicht besonders optimiert habe, aber es sollte die Grundidee verdeutlichen.