42 - Get_next_line

Yayın: 6 Nisan 2025 | Yazar: Derya Acar

Bu proje, bir dosyadan (veya standart girdi akışından) satır satır veri okumanızı sağlayan get_next_line fonksiyonunu içerir. Standart C fonksiyonlarından biri olan read ile elde edilen verileri geçici bir alanda (stash) tutarak, her satırın eksiksiz biçimde döndürülmesini amaçlar. Böylece tek seferde satırın tümünü yakalayabilir ve birden çok dosyayı aynı anda yönetebilirsiniz.


Özellikler


Dosya Açıklamaları


Fonksiyon Açıklamaları


💡 Örnek Kod:


    char    *get_next_line(int fd)
    {
        char        buf[BUFFER_SIZE + 1];
        long        bytes_read;
        static char *stash = NULL;
        char        *line;
    
        line = 0;
        bytes_read = BUFFER_SIZE;
        if (fd < 0 || BUFFER_SIZE <= 0)
            return (ft_free_stash(&stash, 0));
        while (bytes_read > 0)
        {
            bytes_read = read(fd, buf, BUFFER_SIZE);
            if ((bytes_read <= 0 && !stash) || bytes_read == -1)
                return (ft_free_stash(&stash, 0));
            buf[bytes_read] = '\0';
            stash = ft_copy_to_stash(stash, buf);
            if (ft_have_nl(stash))
            {
                line = ft_extract_line(stash);
                if (!line)
                    return (ft_free_stash(&stash, 0));
                return (stash = ft_recreate_stash(stash), line);
            }
        }
        return (ft_free_stash(&stash, 1));
    }
                  

Açıklama: Fonksiyon, dosyadan read ile okunan verileri stash adlı statik değişkende biriktirir. Satır sonu karakterine (\n) rastlandığında, bu satırı kopararak döndürür ve stash kalan metinle güncellenir.


💡 Örnek Kod:


    static char	*ft_recreate_stash(char *stash)
    {
        size_t	i;
        char	*res;

        i = 0;
        if (!stash)
            return (NULL);
        while (stash[i] != '\n')
            i++;
        if (stash[i + 1] == '\0')
            return (ft_free_stash(&stash, 0));
        res = ft_substr(stash, i + 1, ft_strlen(stash));
        if (!res)
        {
            ft_free_stash(&stash, 0);
            return (NULL);
        }
        ft_free_stash(&stash, 0);
        return (res);
    }
        

Açıklama: Fonksiyon, mevcut stash içerisindeki veriyi analiz eder; satır sonu karakterine (\n) kadar olan kısmı okunan satır olarak ayırır ve geriye kalan kısmı yeni bir stash olarak yeniden oluşturur. Böylece, sonraki okuma işlemlerinde eksik veri kalmadan devam edilebilir. Hata durumunda veya verinin tamamı okunduğunda uygun şekilde NULL döner.


💡 Örnek Kod:


    static char	*ft_extract_line(char *stash)
    {
        char	*line;
        size_t	i;
        size_t	j;

        i = 0;
        if (!stash)
            return (0);
        while (stash[i] != '\n')
            i++;
        line = malloc(sizeof(char) * (i + 2));
        if (!line)
            return (0);
        j = 0;
        while (j < i + 1)
        {
            line[j] = stash[j];
            j++;
        }
        line[j] = '\0';
        return (line);
    }
        

Açıklama: Fonksiyon, stash içerisindeki veriden satır sonu karakterine (\n) kadar olan kısmı kopyalayarak yeni bir string oluşturur. Bu şekilde, okunan satır (satır sonu dahil) elde edilir. Eğer stash boşsa ya da bellek tahsisi başarısız olursa, 0 döner.


💡 Örnek Kod:


    static int	ft_have_nl(char *s)
    {
        size_t	i;

        if (!s)
            return (0);
        i = -1;
        while (s[++i] != '\0')
            if (s[i] == '\n')
                return (1);
        return (0);
    }
        

Açıklama: Fonksiyon, verilen stringde satır sonu karakteri (\n) olup olmadığını kontrol eder. Eğer satır sonu karakteri bulunursa 1, bulunmazsa 0 döner.


💡 Örnek Kod:


    static char	*ft_copy_to_stash(char *stash, char *buf)
    {
        char	*res;

        res = 0;
        if (!stash && buf)
        {
            res = ft_strdup(buf);
            if (!res)
                return (NULL);
            return (res);
        }
        res = ft_strjoin(stash, buf);
        ft_free_stash(&stash, 0);
        return (res);
    }
        

Açıklama: Fonksiyon, eğer stash boşsa doğrudan buf'u kopyalar; aksi halde, mevcut stash ile buf verilerini birleştirir. Eski stash belleği ft_free_stash fonksiyonu ile serbest bırakılır ve yeni oluşturulan string döndürülür.


💡 Örnek Kod:


    void	*ft_free_stash(char **stash, int create_line)
    {
        char	*line;

        if (!*stash)
            return (NULL);
        if (create_line == 0)
        {
            if (*stash)
            {
                free(*stash);
                *stash = NULL;
            }
            return (NULL);
        }
        else if (create_line == 1)
        {
            line = ft_strdup(*stash);
            free(*stash);
            *stash = NULL;
            return (line);
        }
        return (NULL);
    }
        

Açıklama: Fonksiyon, stash belleğini uygun şekilde yönetir. Eğer create_line 0 ise, mevcut stash serbest bırakılır ve NULL döner. Eğer create_line 1 ise, stash içeriğinin bir kopyası oluşturulur, orijinal stash belleği serbest bırakılır ve kopyalanan string döndürülür. Bu sayede bellek sızıntısı önlenir.



Buffer Nedir?

Buffer, dosyadan okuma yaparken verinin geçici olarak saklandığı alandır. get_next_line fonksiyonu, read() sistem çağrısı ile BUFFER_SIZE kadar veri okuyup, bu veriyi işlemek için buffer kullanır.

💡 Örnek Kod:


    char buf[BUFFER_SIZE + 1];
    bytes_read = read(fd, buf, BUFFER_SIZE);
        

Stash Nedir?

Stash, okunan verilerin satır sonu karakterine (\n) kadar geçici olarak saklandığı dinamik string'tir. get_next_line fonksiyonu, okuma işlemleri arasında veriyi tutarak satırların eksiksiz bir şekilde elde edilmesini sağlar.

💡 Örnek Kod:


    static char *stash = NULL;
    stash = ft_copy_to_stash(stash, buf);
        

Static Değişkenler Nedir?

Static değişkenler, fonksiyonlar arasında verinin korunmasını sağlayan, programın çalışma süresi boyunca varlığını sürdüren değişkenlerdir. get_next_line fonksiyonunda, stash static olarak tanımlanır; bu sayede fonksiyon çağrıları arasında okunan veriler korunur.


Bellek Yönetimi

Dinamik bellek tahsisi ve serbest bırakma, get_next_line fonksiyonunun doğru çalışması için kritik öneme sahiptir. Okunan satırlar ve stash verisi, bellek sızıntısını önlemek amacıyla uygun şekilde free edilmelidir.


read() Sistem Çağrısı Nedir?

read() fonksiyonu, dosyadan veya standart girişten belirli sayıda byte okuyan bir sistem çağrısıdır. get_next_line fonksiyonu, bu sistem çağrısı ile veriyi okuyarak işlemeye başlar.


BUFFER_SIZE Nedir?

BUFFER_SIZE, get_next_line fonksiyonunun her okuma işleminde kullanacağı byte miktarını belirleyen sabittir. Bu değer, okuma performansı ve bellek kullanımı açısından önem taşır.

💡 Örnek Kod:


    # ifndef BUFFER_SIZE
    #  define BUFFER_SIZE 5
    # endif
                    

Öneri ve İletişim:

Proje hakkında tüm görüş, öneri ve sorularınız için dilediğiniz zaman iletişime geçebilirsiniz. daha çok yazı, bilgi ve içerik için takipte kalmayı unutmayın. Projenin orijinal kaynak kodlarına aşağıdaki bağlantıdan ulaşabilirsiniz:

🔗 Proje GitHub Linki


42 42 Ecole Libft C