автор: bnidia, 10 волна
В этом проекте нам предлагают написать надстройку над системными функциями чтения из файла, которая бы выдавала ровно одну строку при каждом вызове функции.
1. Прототип функции.
char *get_next_line(int fd);
Соответственно функция будет возвращать нам некий указатель на строку char * а принимает функция специальное число, fd которым обозначается file descriptor. Это некий номер потока, который мы узнаем при открытии файла.
2. Как будет вызываться наша функция.
По сути следующий код это ваша тестировочная функция, чтобы проверить работу.
int main(void)
{
int fd = open ("./test1.txt", O_RDONLY);
int i = 1;
while (i++ <= 2) // например печатаем 2 строки из файла test1.txt
{
char *s = get_next_line(fd);
printf("%s\\n", s);
free(s); // обратите внимание что нужно высвободить строку s
// т.к. get_next_line возвращает нам строку память под которую
// была запрошена на куче, функцией malloc
}
close(fd); // закрытие файла
}
Код пишу не по норме, чтобы было лаконичнее. Что произошло? Открыли файл, в цикле вызвали нашу функцию, она нам дала указатель на строку, которую мы можем передать в функцию printf чтобы вывести ее на экран. Далее освобождаем память и в самом конце закрываем файл. **3. Короткий план с чего начинаем.
По сути нам нужно организовать чтение из файла функцией read
char str[1024];
read(fd, str, 1024);
Поискать в строке символ конца строки \n, и отдать строку до этого символа. Функция read принимает в себя fd полученный ранее, указатель на строку (буфер), куда записать прочитанное, и число (тут 1024) сколько байт прочитать.
4. Первые проблемы
а) буфер чтения будет разным и его размер подается во время компиляции
б) мы не знаем насколько длинной будет строка
в) нужно где-то хранить остаток от строки
5. Статические переменные
Еще одна из проблем заключается в том, что при выходе из функции, все переменные объявленные в ней уничтожаются. А нам надо, чтобы функция продолжала хранить как минимум остаток от строки после \n.
На выручку приходит специальное указание static перед объявлением переменной, которое будет оставлять значение переменной для нас в памяти, до тех пор пока работает основная функция (у нас это main из 2 раздела). Важно помнить, что статические переменные по умолчанию инициализируются нулевыми значениями 0 или для ссылок NULL. Обычные переменные мы обязаны инициализировать сами.
Статическими могут быть не только переменные, но и массивы и структуры.