Linux программирование в примерах
Шрифт:
До сих пор мы имели дело с механизмом получения в буфер по крайней мере одной полной строки. Следующий участок обрабатывает случай строки с продолжением. Хотя он должен гарантировать, что конечный символ обратного слеша не является частью нескольких обратных слешей в конце строки. Код проверяет, является ли общее число таких символов четным или нечетным путем простого переключения переменной
Если число четное, условие '
С другой стороны, если число нечетно, строка содержит четное число пар обратных слешей (представляющих символы \\, как в С), и конечную комбинацию символов обратного слеша и конца строки. [43] В этом случае, если в буфере остались по крайней мере 80 свободных байтов, программа продолжает чтение в цикле следующей строки (строки 78–81). (Использование магического числа 80 не очень здорово; было бы лучше определить и использовать макроподстановку.)
43
Этот код несет с собой аромат практического опыта, не удивительно было узнать, что более ранние версии просто проверяли наличие обратного слеша перед символом конца строки, пока кто-то не пожаловался, что он не работает, когда в конце строки есть несколько обратных слешей — Примеч. автора.
По достижении строки 83 программе нужно больше места в буфере. Именно здесь вступает в игру динамическое управление памятью. Обратите внимание на комментарий относительно сохранения значения
Обратите внимание, что здесь вызывается функция
Таким образом, если функция
Обратите внимание, что не всегда подходит использование такой оболочки. Если вы сами хотите обработать ошибки, не следует использовать оболочку. С другой стороны, если нехватка памяти всегда является фатальной ошибкой, такая оболочка вполне удобна.
– 1 : 1;
В заключение, функция
44
Эта функция завершает выполнение программы — Примеч. науч. ред.
3.2.1.9. Только GLIBC: чтение целых строк:
Теперь, когда вы увидели, как читать строки произвольной длины, вы можете сделать вздох облегчения, что вам не нужно самим писать такую функцию. GLIBC предоставляет вам для этого две функции:
Определение константы
Обе функции управляют для вас динамической памятью, гарантируя, что буфер, содержащий входную строку, достаточно большой для размещения всей строки. Их отличие друг от друга в том, что
Указатель на
Остров Крым
Фантастика:
социально-философская фантастика
альтернативная история
рейтинг книги
Политолог
Проза:
современная проза
рейтинг книги
Три Меченосца. Книга первая. Желтая сталь алфейнов
Хроники Гэмдровса
Фантастика:
фэнтези
эпическая фантастика
героическая фантастика
боевая фантастика
рейтинг книги
Архонт
5. Стеллар
Фантастика:
боевая фантастика
рпг
рейтинг книги
Поход
4. Ермак
Фантастика:
боевая фантастика
альтернативная история
рейтинг книги
Камень Книга седьмая
7. Камень
Фантастика:
фэнтези
боевая фантастика
рейтинг книги
Кодекс «Альтмана»
4. Прикрытие-Один
Детективы:
шпионские детективы
рейтинг книги
Лягушки
Проза:
современная проза
рейтинг книги
Бездна
21. Другая сторона
Фантастика:
боевая фантастика
рпг
уся
попаданцы
рейтинг книги
Последний реанорец. Том VIII
7. Высшая Речь
Фантастика:
фэнтези
попаданцы
аниме
рейтинг книги
Вторжение
4. Древний
Фантастика:
боевая фантастика
рейтинг книги
Черный Маг Императора 11
11. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
рейтинг книги
Газлайтер. Том 28
28. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
рейтинг книги
Приключения 1969
Приключения:
прочие приключения
рейтинг книги