GETLINE(3)

NAZWA
getline, getdelim - wprowadzanie łańcuchów rozgraniczonych

SKŁADNIA
#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);

Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

getline(), getdelim():
    Od glibc 2.10:
        _POSIX_C_SOURCE >= 200809L
    Przed glibc 2.10:
        _GNU_SOURCE

OPIS
getline() odczytuje całą linię ze strumienia stream, przechowując adres bufora zawierającego tekst w *lineptr. Bufor jest zakończony znakiem NULL i zawiera znak nowej linii, jeśli go napotkano.

Gdy *lineptr jest ustawione na NULL i *n jest ustawione na 0 przed wywołaniem, to funkcja getline() przydziela bufor dla umieszczenia w nim zawartości linii. Bufor ten powinien zostać zwolniony przez program użytkownika nawet wówczas, gdy getline() zawiedzie.

Alternatywnie, przed wywołaniem getline() *lineptr może zawierać wskaźnik do bufora przydzielonego za pomocą malloc() o rozmiarze *n bajtów. Gdy rozmiar bufora nie jest wystarczający do umieszczenia w nim odczytanej linii, getline() rozszerzy go do odpowiedniego rozmiaru za pomocą realloc(), modyfikując *lineptr i *n, jeśli będzie to potrzebne.

W każdym razie, po pomyślnym wywołaniu *lineptr i *n będą zaktualizowane tak, aby odzwierciedlić, odpowiednio, adres i rozmiar bufora.

getdelim() działa jak getline(), z tym wyjątkiem że jako argument delimiter można podać ogranicznik linii inny niż znak nowej linii. Podobnie jak dla getline(), znak ogranicznika nie jest dodawany, gdy nie występował w danych wejściowych przed osiągnięciem końca pliku.

WARTOŚĆ ZWRACANA
Po pomyślnym zakończeniu, getline() i getdelim() zwracają liczbę odczytanych znaków, łącznie ze znakiem ogranicznika, ale nie włączając kończącego bajtu null ("\0"). Wartość ta może służyć to wychwycenia znaków null zawartych w odczytanej linii.

Obie funkcje zwracają -1, gdy nie uda się odczytać linii (włączając w to próbę czytania na końcu pliku). W razie wystąpienia błędu ustawiana jest zmienna errno aby wskazać przyczynę.

BŁĘDY

EINVAL
    Błędne wartości parametrów (n lub lineptr równe NULL lub nieprawidłowy stream).

ENOMEM
    Nie powiódł się przydział pamięci dla bufora linii.

ATRYBUTY
Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).
Interfejs | Atrybut | Wartość
getline(), getdelim() | Bezpieczeństwo wątkowe | MT-Safe

ZGODNE Z
Zarówno getline(), jak i getdelim() są rozszerzeniami GNU. Zostały dołączone do standardu POSIX.1-2008.

PRZYKŁADY
    #define _GNU_SOURCE
    #include <stdio.h>
    #include <stdlib.h>
    int
    main(int argc, char *argv[])
    {
        FILE *stream;
        char *line = NULL;
        size_t len = 0;
        ssize_t nread;
        if (argc != 2) {
            fprintf(stderr, "Użycie: %s <file>\n", argv[0]);
            exit(EXIT_FAILURE);
        }
        stream = fopen(argv[1], "r");
        if (stream == NULL) {
            perror("fopen");
            exit(EXIT_FAILURE);
        }
        while ((nread = getline(&line, &len, stream)) != -1) {
            printf("Pobrano wiersz o długości %zu:\n", nread);
            fwrite(line, nread, 1, stdout);
        }
        free(line);
        fclose(stream);
        exit(EXIT_SUCCESS);
    }

ZOBACZ TAKŻE
read(2), fgets(3), fopen(3), fread(3), scanf(3)

O STRONIE
Angielska wersja tej strony pochodzi z wydania 5.08 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów oraz najnowszą wersję oryginału można znaleźć pod adresem https://www.kernel.org/doc/man-pages/.

TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com> Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI. Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres <manpages-pl-list@lists.sourceforge.net>.