Цель этого проекта — написать функцию, которая возвращает строку, заканчивающуюся символом новой строки, считанную из дескриптора файла.
Этот проект не только позволит вам добавить очень удобную функцию в вашу коллекцию, но также позволит вам изучить очень интересную новую концепцию в программировании на C: "статические переменные"
int get_next_line(int fd, char **line);
Ваша программа должна компилироваться с флагом -D BUFFER_SIZE=xx, который будет использоваться в качестве размера буфера для вызовов чтения в вашем get_next_line.
Основное условие проекта: Функция get_next_line должна корректно работает при чтении из файла и при чтении из стандартного ввода.
GNL с файлами
gcc tests/main.c -Wall -Wextra -Werror -D BUFFER_SIZE=32 get_next_line.c get_next_line_utils.c
./a.out tests/files/test01_with_lines
P.s. В папке "tests/files/" есть ещё файлы для тестирования, в том числе и файл на 1600+ строк
GNL с текстом из терминала (stdin)
gcc tests/main_stdin.c -Wall -Wextra -Werror -D BUFFER_SIZE=32 get_next_line.c get_next_line_utils.c
./a.out
Согласно теме проекта - get_next_line читает строку из файла, после чего готовится к чтению следующей строки. Вызов функции GNL в цикле позволит читать текст, доступный в файловом дескрипторе, по одной строке за раз, пока не достигнет EOF (конеца файла).
Ниже представлена фрагмент файла main, написанного для проверки функции GNL
int main(int argc, char **argv)
{
int fd, ret, line_count;
char *line;
line_count = 1;
ret = 0;
line = NULL;
if (argc == 2)
{
fd = open(argv[1], O_RDONLY);
while ((ret = get_next_line(fd, &line)) > 0)
{
printf(" \n [ Return: %d ] | A line has been read #%d => %s\n", ret, line_count, line);
line_count++;
free(line);
}
printf(" \n [ Return: %d ] A line has been read #%d: %s\n", ret, line_count++, line);
printf("\n");
if (ret == -1)
printf("-----------\n An error happened\n");
else if (ret == 0)
{
printf("-----------\n EOF has been reached\n");
free(line);
}
close(fd);
}
Одной из основных переменных проекта является fd (строка ниже), который возвращает целое чесло, что будет использоваться в качестве параметра для функции get_next_line .
fd = open(argv[1], O_RDONLY);
Функция get_next_line вернет целое число , которое будет использоваться для оценки всех строк до конца файла.
Значение | Описание |
---|---|
1 | Строка прочитана |
0 | EOF (конец файла) |
-1 | Произошла ошибка |
Если у вас возникнет желание протестировать мою функцию, то положите свои тестовые файлы в папку "tests/files/" и запустите программу как показанно ниже
gcc tests/main.c -Wall -Wextra -Werror -D BUFFER_SIZE=32 get_next_line.c get_next_line_utils.c
./a.out tests/files/ваш_тестовый_файл