Поддержка множественный дескриптор файла - C (СИ)
Формулировка задачи:
Здраствуйте! Помогите доделать функцию под поддержку множественого файл дискриптора. Сама функция построчно считывает. Проблема возникает при увилечение буфера больше 2.
и мейн для проверки)
Спасибо!)
#include "get_next_line.h" static int ft_read(char **str, int fd) { int ret; char *s; char *buff; buff = ft_strnew(BUFF_SIZE); if ((ret = read(fd, buff, BUFF_SIZE)) == -1) return (-1); buff[ret] = '\0'; s = *str; *str = ft_strjoin(*str, buff); ft_strdel(&buff); if (*s != 0) ft_strdel(&s); return (ret); } static int ft_get_line(char **str, char **line, char *s) { int i; char *join; i = 0; if (*s == '\n') i = 1; *s = 0; *line = ft_strjoin("", *str); if (i == 0 && ft_strlen(*str) != 0) { *str = ft_strnew(1); return (1); } else if (i == 0 && !(ft_strlen(*str))) return (0); join = *str; *str = ft_strjoin(s + 1, ""); free(join); return (i); } int get_next_line(const int fd, char **line) { int ret; char *s; static char *str; if (str == 0) str = ""; if (!line || BUFF_SIZE < 1) return (-1); ret = BUFF_SIZE; while (line) { s = str; while (*s || ret < BUFF_SIZE) { if (*s == '\n' || *s == 0 || *s == -1) return (ft_get_line(&str, line, s)); s++; } ret = ft_read(&str, fd); if (ret == -1) return (-1); } return (0); }
#ifndef GET_NEXT_LINE_H # define GET_NEXT_LINE_H # include <fcntl.h> # include "libft/libft.h" # define BUFF_SIZE 4 int get_next_line(const int fd, char **line); #endif
#include "get_next_line.h" #include "libft.h" #include <stdio.h> int main(int argc, char **argv) { int fd; char *line; int ret; argc = argc + 0; fd = open(argv[1], O_RDONLY); while ((ret = get_next_line(fd, &line)) == 1) { printf("%d : %s\n", ret, line); ft_strdel(&line); } return (0); }
Решение задачи: «Поддержка множественный дескриптор файла»
textual
Листинг программы
size_t ft_strlen(const char *s) { int i; i = 0; while (s[i] != '\0') i++; return (i); }
Объяснение кода листинга программы
В данном коде представлена реализация функции ft_strlen
, которая принимает в качестве аргумента константный указатель s
на строку символов и возвращает её длину в формате size_t
.
Внутри функции создаётся переменная i
типа int
, которая инициализируется нулём. Затем в цикле while
с условием s[i] != '\0'
переменной i
присваивается значение s[i]
, и после каждой итерации i
увеличивается на единицу. Цикл продолжается до тех пор, пока не будет встречен нулевой символ.
По завершении цикла функция возвращает значение переменной i
, которое является длиной строки.