Только GLIBC: чтение целых строк: и — КиберПедия 

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Только GLIBC: чтение целых строк: и

2021-01-29 90
Только GLIBC: чтение целых строк: и 0.00 из 5.00 0 оценок
Заказать работу

 

Теперь, когда вы увидели, как читать строки произвольной длины, вы можете сделать вздох облегчения, что вам не нужно самим писать такую функцию. GLIBC предоставляет вам для этого две функции:

 

 

Определение константы вводит объявления функций и. В противном случае они неявно объявлены как возвращающие. Для объявления возвращаемого типа нужен файл. (является «знаковым». Он предназначен для такого же использования, что и, но в местах, где может понадобиться использование также и отрицательных значений.)

Обе функции управляют для вас динамической памятью, гарантируя, что буфер, содержащий входную строку, достаточно большой для размещения всей строки. Их отличие друг от друга в том, что читает до символа конца строки, a использует в качестве разделителя символ, предоставленный пользователем. Общие аргументы следующие:

 

Указатель на указатель для адреса динамически выделенного буфера. Чтобы сделала всю работу, он должен быть инициализирован. В противном случае, он должен указывать на область памяти, выделенную с помощью.

 

Указатель на размер буфера. Если вы выделяете свой собственный буфер, должно содержать размер буфера. Обе функции обновляют новым значением размера буфера, если они его изменяют.

 

Место, откуда следует получать входные символы.

По достижении конца файла или при ошибке функция возвращает ‑1. Строки содержат завершающий символ конца строки или разделитель (если он есть), а также завершающий нулевой байт. Использование просто, как показано в:

 

 

Вот эта функция в действии, показывающая размер буфера. Третья входная и выходная строки намеренно длинные, чтобы заставить увеличить размер буфера:

ch03‑getline

This is a line

 

And another line.

 

A llllllllllllllllloooooooooooooooooooooooooooooooonnnnnnnnnnnnnnnngnnnggggggggggg llliiiiiiiiiiiiiiiiiiinnnnnnnnnnnnnnnnnnnneeeeeeeeee

 

Копирование строк:

 

Одной чрезвычайно типичной операцией является выделение памяти для копирования строки. Это настолько типично, что многие программисты предусматривают для нее простую функцию вместо использования внутритекстового кодирования, и часто эта функция называется:

 

 

С появлением стандарта POSIX 2001 программисты по всему миру могут вздохнуть свободнее: эта функция является теперь частью POSIX в виде расширения XSI:

 

Возвращаемое значение равно, если была ошибка, или указатель на динамически выделенную память с копией. Возвращенное значение должно быть освобождено с помощью, когда больше не требуется.

 

Системные вызовы: и

 

Четыре функции, которые мы рассмотрели (,, и) являются стандартными, переносимыми функциями для управления динамической памятью.

На Unix‑системах стандартные функции реализованы поверх двух дополнительных, очень примитивных процедур, которые непосредственно изменяют размер адресного пространства процесса. Мы представляем их здесь, чтобы помочь вам понять, как работают GNU/Linux и Unix (снова «под капотом»); крайне маловероятно, что вам когда‑нибудь понадобится использовать эти функции в обычных программах. Они определены следующим образом:

 

Системный вызов действительно изменяет адресное пространство процесса. Адрес является указателем, представляющим окончание сегмента данных (на самом деле, области кучи, как было показано ранее на рис. 3.1). Ее аргумент является абсолютным логическим адресом, представляющим новое окончание адресного пространства. В случае успеха функция возвращает 0, а в случае неуспеха (‑1).

Функцию использовать проще; ее аргумент является числом байтов, на которое нужно увеличить адресное пространство. Вызвав ее с приращением 0, можно определить, где в настоящее время заканчивается адресное пространство. Таким образом, чтобы увеличить адресное пространство на 32 байта, используется код следующего вида:

 

 

Практически, вам не нужно непосредственно использовать. Вместо этого используется исключительно для увеличения (или даже сокращения) адресного пространства. (Вскоре мы покажем, как это делать, в разделе 3.2.5. «Исследование адресного пространства».)

Еще более практично вообще никогда не использовать эти процедуры. Программа, которая их использует, не может затем использовать также и, и это создает большую проблему, поскольку многие элементы стандартной библиотеки полагаются на использование. Поэтому использование или может приводить к трудно обнаруживаемым крушениям программы.

Но знать о низкоуровневых механизмах стоит, и конечно же, набор функций реализован с помощью и.

 


Поделиться с друзьями:

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.007 с.