Setvbuf установить буфер вв


SETBUF(3S)

ОПИСАНИЕ
Функция setbuf может быть использована после открытия потока, но перед тем, как выполнена первая из процедур ввода/вывода. При этом массив, на который указывает аргумент buf, будет использоваться вместо автоматически назначаемых буферов. Если значение buf равно NULL, ввод/вывод будет полностью небуферизованным.

Требуемый размер буфера определяется константой BUFSIZ, заданной во включаемом файле :

Функция setvbuf также может быть использована сразу после открытия потока, но перед тем, как выполнена первая из процедур ввода/вывода. Аргумент type определяет тип буферизации. Допустимы следующие типы буферизации, описанные в : _IOFBF Полная буферизация ввода/вывода.

_IOLBF Строчная буферизация вывода; буфер вывода выталкивается при выдаче символа перевода строки, заполнении буфера или запросе на ввод.

_IONBF Полное отсутствие буферизации ввода/вывода.

Если значение buf не равно NULL, массив, на который указывает buf, будет использоваться вместо автоматически назначаемых буферов. Аргумент size задает размер используемого буфера. Константа BUFSIZ, определенная во включаемом файле , является разумным значением для размера буфера. Если ввод/вывод небуферизован, то аргументы buf и size игнорируются.

По умолчанию вывод на терминал является строчно буферизованным, а весь остальной ввод/вывод буферизуется полностью.

ДИАГНОСТИКА
Если указано некорректное значение для аргументов type или size, то функция setvbuf возвращает ненулевое значение. В противном случае результат равен 0.

ПРИМЕЧАНИЯ
Распространенной ошибкой является выделение под буфер локальной переменной блока без закрытия потока при выходе из блока.

Setvbuf установить буфер в/в

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

setbuffer(), setlinebuf(): _BSD_SOURCE

ОПИСАНИЕ

Обычно, для файлов включена блочная буферизация. Если поток ссылается на терминал (обычно для stdout), то он буферизируется построчно. Стандартный поток ошибок stderr по умолчанию никогда не буферизируется.

Функция setvbuf() может быть использована для изменения типа буферизации любого открытого потока. Параметр mode должен быть одним из трёх следующих макросов:

_IONBF отключить буферизацию _IOLBF строковая буферизация _IOFBF полная буферизация

За исключением небуферизованных файлов аргумент buf должен указывать на буфер размером, как минимум, size байт; этот буфер будет использоваться вместо текущего. Если аргумент buf равен NULL, то это отразится только на типе буферизации; при следующей операции чтения или записи будет создан новый буфер. Функция setvbuf() может быть использована только после открытия потока и до выполнения над ним любых операций.

Остальные три вызова, фактически, являются псевдонимами вызова setvbuf(). Функция setbuf() в точности соответствует вызову

setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);

Функция setbuffer() также аналогична ей, но размер буфера в данном случае определяется вызывающим, а не размером по умолчанию BUFSIZ. Функция setlinebuf() полностью идентична вызову

setvbuf(stream, NULL, _IOLBF, 0);

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Другие функции не возвращают никаких значений.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
setbuf(), setbuffer(),
setlinebuf(), setvbuf()
безвредность в нитях безвредно (MT-Safe)

СООТВЕТСТВИЕ СТАНДАРТАМ

ДЕФЕКТЫ

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

Setvbuf установить буфер в/в

void setbuf(FILE * stream , char * buf );
void setbuffer(FILE * stream , char * buf , size_t size );
void setlinebuf(FILE * stream );
int setvbuf(FILE * stream , char * buf , int mode , size_t size );

ОПИСАНИЕ

Функция setvbuf может быть использована над любым открытым потоком для изменения типа буферизации. Параметр mode должен быть одним из трех следующих макросов: _IONBF (отключить буферизацию); _IOLBF (строчная буферизация); _IOFBF (блочная буферизация).

Аргумент buf должен указывать на буфер (кроме случаев, когда буферизация отключается) размером, как минимум, равным size байтам; и этот буфер будет использоваться вместо текущего. Если аргумент buf равен NULL , то это отразится только на буферизации; при следующей операции считывания или записи будет создан новый буфер. Функция setvbuf может быть использована после открытия потока и до выполнения над ним любых операций.

Следующие три вызова идентичны по сути вызову setvbuf . Функция setbuf в точности соответствует вызову

setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);

Функция setbuffer также аналогична ей, но размер буфера в данном случае определяется вызовом, а не размером по умолчанию BUFSIZ . Функция setlinebuf полностью идентична вызову

setvbuf setvbuf

Управляет потоковой буферизацией и размером буфера. Controls stream buffering and buffer size.

Синтаксис Syntax

Параметры Parameters

вышестоящий stream
Указатель на структуру FILE. Pointer to FILE structure.

buffer buffer
Выделенный пользователем буфер. User-allocated buffer.

mode mode
Режим буферизации. Mode of buffering.

size size
Размер буфера в байтах. Buffer size in bytes. Допустимый диапазон: 2 Allowable range: 2 На внутреннем уровне значение, заданное для параметра size , округляется вниз до ближайшего числа, кратного 2. Internally, the value supplied for size is rounded down to the nearest multiple of 2.

Возвращаемое значение Return Value

Возвращает 0 в случае успеха. Returns 0 if successful.

Если Stream имеет значение NULLили если режим или Размер не находятся в допустимом изменении, вызывается обработчик недопустимых параметров, как описано в разделе Проверка параметров. If stream is NULL, or if mode or size is not within a valid change, the invalid parameter handler is invoked, as described in Parameter Validation. Если продолжение выполнения разрешено, эта функция возвращает –1 и задает для errno значение EINVAL. If execution is allowed to continue, this function returns -1 and sets errno to EINVAL.

Дополнительные сведения об этих и других кодах ошибок см. в разделе _doserrno, errno, _sys_errlist и _sys_nerr. For information on these and other error codes, see _doserrno, errno, _sys_errlist, and _sys_nerr.

Примечания Remarks

Функция setvbuf позволяет программе управлять как буферизацией, так и размером буфера для потока. The setvbuf function allows the program to control both buffering and buffer size for stream. поток должен ссылаться на открытый файл, который не проходил операцию ввода-вывода с момента открытия. stream must refer to an open file that has not undergone an I/O operation since it was opened. Массив, на который указывает buffer , используется в качестве буфера, если он не равен null, в этом случае setvbuf использует автоматически выделяемый буфер размера/2 * 2 байта. The array pointed to by buffer is used as the buffer, unless it is NULL, in which case setvbuf uses an automatically allocated buffer of length size/2 * 2 bytes.

Илон Маск рекомендует:  Выбор данных из нескольких таблиц

Режим должен быть _IOFBF, _IOLBFили _IONBF. The mode must be _IOFBF, _IOLBF, or _IONBF. Если mode имеет значение _IOFBF или _IOLBF, то size используется в качестве размера буфера. If mode is _IOFBF or _IOLBF, then size is used as the size of the buffer. Если параметр mode имеет значение _IONBF, поток не буферизован, а Размер и буфер не учитываются. If mode is _IONBF, the stream is unbuffered and size and buffer are ignored. Значения для mode и их значений: Values for mode and their meanings are:

значение режима mode value Значение Meaning
_IOFBF _IOFBF Полная буферизация; то есть буфер используется в качестве буфера, а Размер используется в качестве размера буфера. Full buffering; that is, buffer is used as the buffer and size is used as the size of the buffer. Если значение buffer равно null, используется автоматически выделяемый Размер буфера (в байтах). If buffer is NULL, an automatically allocated buffer size bytes long is used.
_IOLBF _IOLBF В некоторых системах таким образом осуществляется линейная буферизация. For some systems, this provides line buffering. Однако для Win32 поведение аналогично _IOFBF -полной буферизации. However, for Win32, the behavior is the same as _IOFBF — Full Buffering.
_IONBF _IONBF Буфер не используется, независимо от размера буфера или размеров. No buffer is used, regardless of buffer or size.

Требования Requirements

Подпрограмма Routine Обязательный заголовок Required header
setvbuf setvbuf

Дополнительные сведения о совместимости см. в разделе Совместимость. For additional compatibility information, see Compatibility.

Язык программирования Си для персонального компьютера (46 стр.)

Стандартные потоки: stdin, stdout, stdeir, stdaux, stdprn.

Когда программа начинает выполняться, автоматически открываются пять потоков. Эти потоки — стандартный ввод (stdin), стандартный вывод (stdout), стандартный вывод для сообщений об ошибках (stderr), стандартный последовательный порт (stdaux) и стандартное устройство печати (stdprn).

По умолчанию стандартный ввод/вывод и стандартный вывод сообщений об ошибках связывается с консольным терминалом.

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

Следующие указатели на структуру типа. FILE определяются в файле stdio.h и могут использоваться в любом месте как указатели потоков:

extern FILE * stdin; — стандартный ввод

extern FILE * stdout; — стандартный вывод


extern FILE * stderr; — стандартный вывод сообщений об ошибках

extern FILE * sidaux; — стандартный порт

extern FILE * stdprn; — стандартное устройство печати

При запуске оттранслированной программы на выполнение можно использовать символы перенаправления в/в из командного языка MS-DOS ( или >> ) для переопределения стандартного ввода и вывода программы.

Можно переопределить stdin, stdout, stderr, stdaux или stdprn так, что они будут относиться к файлу на диске или устройству. Такие возможности предоставляет функция freopen.

Управление буферизацией потоков

Открытые файлы, для которых осуществляется высокоуровневый ввод/вывод, буферизуются по умолчанию, за исключением потоков stdin, stdout, stderr, stdaux, stdprn.

Потоки stderr и stdaux — не буферизованы. Если к ним применяется функция printf или scanf, создается временный буфер. Для обоих потоков может задаваться буферизация с помощью функций setbuf или setvbuf.

Буферизация для потоков stdin, stdout, stdprn выполняется следующим образом: буфер сбрасывается при его заполнении или когда вызванная библиотечная функция ввода/вывода завершает работу.

Использованием функции setbuf или setvbuf можно сделать поток небуферизованным или связать буфер с небуферизованным до этого потоком. Буфера, размещенные в системе, недоступны пользователю, кроме буферов, полученных с помощью setbuf или setvbuf.

Буфера должны иметь постоянный размер, равный константе BUFSIZ в stdio.h.

Если используется setvbuf, размер буфера устанавливает пользователь. Буфера автоматически сбрасываются при их наполнении, или когда связанный с буфером файл закрывается, или когда происходит нормальное завершение программы.

Можно сбросить буфера в произвольный момент времени, используя функции fflush и flushall. Функция fflush сбрасывает буфер одного заданного потока, а функция flushall сбрасывает буфера всех потоков, которые открыты и буферизованы в данный момент.

Закрытие потоков

Функции fclose и fcloseall закрывают поток или потоки. Функция fclose закрывает один заданный поток, fcloseall — все потоки, кроме потоков stdin, stdout, stderr, stdaux, stdprn.

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

Чтение и запись данных

Функции ввода/вывода верхнего уровня позволяют передавать данные различными способами.

Операции чтения и записи в потоках начинаются с текущей. позиции в потоке, идентифицируемой как «file pointer»

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

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

Поток, связанный с таким устройством, как консольный терминал, не имеет указателя файла. Программы, которые перемещают указатель файла (с помощью функции fseek), будут иметь в этом случае неопределенный результат.

Обнаружение ошибок

Когда происходит ошибка в операции с потоком, устанавливается в ненулевое значение флажок ошибки для потока. Можно использовать макроопределение ferror, чтобы определить, произошла ли ошибка.

После каждой ошибки флажок ошибки остается установленным до тех пор, пока не будет сброшен вызовом функции clearerr или rewind.

Функции вода/вывода нижнего уровня

Функция Краткое описание
close закрыть файл
creat создать файл
dup создать второй дескриптор (handle) для файла
dup2 переназначить дескриптор (handle) для файла
eof проверка на конец файла
lseek позиционирование указателя файла в заданное место
open открыть файл
read читать данные из файла
sopen открыть файл в режиме разделения
tell получить текущую позицию указателя файла
write записать данные в файл

Система программирования ТС предоставляет дополнительно следующие функции:

Функция Краткое описание
_creat создать файл
creatnew создать новый файл
creattemp создать новый файл
_ореn открыть файл
_read чтение данных из файла
_write запись данных в файл

Нижний уровень ввода и вывода не работает с буферизованными или форматированными данными. Для работы с файлами, открытыми посредством функции нижнего уровня, используется дескриптор файла (handle).

Для открытия файлов используются функции open и _ореn; В ОС MS/DOC версии 3.0 или выше может быть использована функция sopen для открытия файлов с атрибутами режима разделения файла.

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

Прототипы функций нижнего уровня содержатся в файле io.h.

Открытие файлов

Файл должен быть открыт функциями open, sopen или creat до выполнения первой операции ввода или вывода с использованием функций нижнего уровня для этого файла.

Файл может быть открыт для чтения, записи, или для чтения и записи, может быть открыт в текстовом или в двоичном режиме.

Файл fcntl.h должен быть включен при открытии файла, так как содержит определения для флагов, используемых в функции open. В некоторых случаях также должны быть включены файлы sys\types.h и sys\stat.h.

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

9.6.2.2. Переопределение дескрипторов (handle)

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

Каждый из этих дескрипторов соответствует одному из стандартных потоков, значения этих дескрипторов таковы:

поток значение дескриптора
stdin
stdout 1
stderr 2
stdaux 3
stdprn 4

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

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

Как выполняется буферизация строк для входных потоков C stdio?

Я понимаю, что полностью буферизованный ввод может быть реализован путем выдачи одиночного syscall read для блока данных, возможно превышающего требуемое приложением. Но я не понимаю, как линейная буферизация может применяться для ввода без поддержки ядра. Я предполагаю, что нужно было бы прочитать блок данных, а затем искать новые строки, но если да, то в чем разница с полной буферизацией?

Предположим, что у меня есть входной поток FILE* in . Существует ли какая-либо разница между тем, как библиотека stdio будет извлекать байты из операционной системы для заполнения своего буфера?

  • Буферизация строк: setvbuf(in, NULL, _IOLBF, BUFSIZ)
  • Полная буферизация: setvbuf(in, NULL, _IOFBF, BUFSIZ)

Если да, то в чем разница?

A FILE struct имеет внутренний буфер по умолчанию. После fopen и на fread , fgets и т.д. Буфер заполняется уровнем stdio из вызова read(2) .

Когда вы выполните fgets , он скопирует данные в буфер, вытащив их из внутреннего буфера [пока не будет найдена новая строка]. Если новая строка не найдена, внутренний буфер потока пополняется другим вызовом read(2) . Затем продолжается поиск новой строки и заполнения буфера.

Это может повторяться несколько раз [особенно верно, если вы делаете fread ]. Все, что осталось, доступно для следующей операции чтения потока (например, fread , fgets , fgetc ).

Вы можете установить размер буфера потока с помощью setlinebuffer . Для эффективности типичным размером по умолчанию является размер страницы машины [IIRC].

Итак, буфер потока «остается на один шаг впереди вас», так сказать. Он работает так же, как кольцевая очередь [фактически, если не актуальность].

Не знаю, но буферизация строк [или любой режим буферизации] обычно используется для выходных файлов (например, для stdout по умолчанию). Он говорит, что если вы видите новую строку, введите подразумеваемый fflush . Полная буферизация означает fflush , когда буфер заполнен. Небуферизованные средства делают fflush для каждого символа.

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

На входе буферизация строк не имеет никакого значения для файла [AFAICT]. Он просто пытается использовать наиболее эффективный размер (например, размер буфера потока).

Я думаю, что важным моментом является то, что при вводе вы не знаете, где находится новая строка, поэтому _IOLBF работает как любой другой режим — потому что это необходимо. (т.е.) вы читаете (2) до размера потока buf (или суммы, необходимой для выполнения выдающегося fread ). Другими словами, единственное, что имеет значение, — это размер внутреннего буфера и параметры размера/счета fread , а не режим буферизации.

Для устройства TTY (например, stdin) поток будет ждать новой строки [если вы не используете TIOC * ioctl для базовых fildes (например, 0), чтобы установить char -at-a-time aka raw mode], независимо режима потока. Это из-за того, что канонический уровень обработки устройства TTY [в ядре] задерживает чтение (например, почему вы можете набирать backspace и т.д. Без приложения, которое должно иметь дело с ним).

Однако выполнение fgets на устройстве/потоке TTY будет получать специальную обработку внутри (например), она будет делать select/poll и получать количество ожидающих символов и читать только эту сумму, поэтому она не будет блокироваться на читать. Затем он будет искать новую строку и переиздавать select/poll, если новая строка не найдена. Но, если новая строка найдена, она возвращается из fgets . Другими словами, он будет делать все, что необходимо для обеспечения ожидаемого поведения на stdin. Это не сделало бы для этого, чтобы блокировать чтение 4096 байт, если пользователь ввел 10 символов + новую строку.

UPDATE:

Чтобы ответить на второй раунд последующих вопросов


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

Обычно это верно. Большинство приложений не пытаются настроить параметры уровня TTY. Но приложение может сделать это, если захочет, но не через любые функции stream/stdio.

Но процесс полностью не знает об этих настройках и не может их изменить.

Опять же, обычно верно. Но, опять же, процесс может изменить их.

Если мы находимся на одной странице, то, что вы говорите, означает, что вызов setvbuf изменит политику буферизации устройства tty, и я считаю, что трудно смириться с моим пониманием Unix I/O.

Нет setvbuf устанавливает размер и политику потока буфера потока. Это не имеет никакого отношения к ядру. Ядро видит только read(2) и не имеет представления, было ли это приложение необработанным или поток сделал это через fread [или fgets ]. Это никак не влияет на уровень TTY.

В обычном приложении, которое циклически на fgetc и пользователь вводит abcdef\n , fgetc будет блокировать [в драйвере] до ввода новой строки. Это канонический обрабатывающий слой TTY делает это. Затем, когда введена новая строка, read(2) , сделанный fgetc , вернется со значением 7 . первый fgetc вернется, а остальные шесть будут выполняться быстро, выполняя их из внутреннего буфера потока.

Более сложные приложения могут изменить политику уровня TTY с помощью ioctl(fileno(stdin),TIOC*. ) . Поток не будет знать об этом. Поэтому при этом нужно быть осторожным. Таким образом, если процесс хочет, он может полностью контролировать уровень TTY за файловым блоком, но должен делать вручную через ioctl

Использование ioctl для изменения [или даже отключения] TTY-канонической обработки [aka «TTY raw mode» ] может использоваться приложениями, которым необходим истинный вход char -at-a-time. Например, vim , emacs , getkey и т.д.

В то время как приложение может смешивать режим raw и поток stdio [и делать это эффективно], обычное использование — либо использовать потоки в их обычном режиме/использовании , либо полностью обходить уровень stdio, do ioctl(0,TIOC*. ) , а затем непосредственно read(2) .

Кто бесплатный буфер setvbuf?

Итак, я вникал в то, как реализована часть libd lib, и я столкнулся с другим вопросом. Глядя на man setvbuf , я вижу следующее:

Когда происходит первая операция ввода-вывода вызывается файл, malloc (3), и буфера.

Это имеет смысл, ваша программа не должна иметь malloc в ней для ввода-вывода, если вы на самом деле ее не используете. Моя реакция на это заключается в том, что libc очистит свой собственный беспорядок здесь. Я могу только предположить, что это происходит потому, что valgrind не сообщает о утечке памяти (они могли бы, конечно, сделать что-то грязное и не распределять его напрямую через malloc . но мы предположим, что в настоящее время он использует malloc ).

Но, вы также можете указать свой собственный буфер.

Нет, утечка памяти! valgrind подтверждает это. Поэтому кажется, что всякий раз, когда stdio самостоятельно распределяет буфер, он автоматически удаляется (не позднее, чем при выходе из программы, но, возможно, в потоке закрывается). Но если вы явно укажете буфер, вы должны сами его очистить.

Однако есть уловка. Страница руководства также говорит следующее:

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

Теперь это становится интересным для стандартных потоков. Как правильно очистить вручную выделенный буфер для них, поскольку они закрыты в завершении программы? Я мог представить себе «очистить это, когда я закрываю флаг» внутри файловой структуры, но он становится волосатым, потому что, если я прочитаю это правильно, сделаем что-то вроде этого:

приведет к 2 выделениям стандартной библиотеки из-за этого предложения:

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

ИЗМЕНИТЬ: добавление к моему вопросу. Поскольку ясно, что я должен free передать любые буферы на setvbuf , если я действительно использую его на stdout , существует ли какой-либо практический способ free его? Он должен жить для завершения программы. Самое лучшее, что я могу придумать, — это fclose(stdout) , затем освободить его или использовать статический буфер, о котором говорили некоторые люди. Я спрашиваю, потому что это похоже на неудобное дизайнерское решение.

Вопрос по stdin, buffer, c &#8211 setvbuf не может сделать стандартный буфер без буферизации

Моим главным намерением было сделать getchar вернуться, как только он получает персонаж вместо того, чтобы ждатьENTER ключ. Я пробовал это

Сравнивая это с прототипом setvbuf

это должно установить stdin в небуферизованный режим.

Но до сих пор getchar() продолжает ждатьENTER

Я видел похожие посты, подобные этой

которые предлагают альтернативные методы, чтобы сделать stdin небуферизован. Но мне любопытно узнать, почему setvbuf метод не работает

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

Чтобы получить посимвольный ввод из терминала, вы должны вывести его из канонического режима в режим raw или cbreak, и для этого требуются совсем другие операции. Взгляните на руководство по POSIX на«Общий интерфейс терминала» о том, как управлять терминалом. Или рассмотрите возможность использования curses библиотека.

Setvbuf установить буфер в/в

Самая актуальная документация по Visual Studio 2020: Документация по Visual Studio 2020.

Управляет буферизацией потока и размер буфера.

Параметры

stream
Указатель на структуру FILE .

buffer
Выделенный пользователем буфер.

mode
Режим буферизации.

size
Размер буфера в байтах. Допустимый диапазон: 2 size Внутренне значение, указанное для size округляется вниз до ближайшего числа, кратного 2.

Возвращает 0 в случае успеха.

Если stream — NULL , или если mode или size находится не в пределах допустимых изменений, обработчик недопустимого параметра вызывается, как описано в проверки параметров. Если выполнение может быть продолжено, эта функция возвращает -1 и задает errno в EINVAL .

Сведения об этих и других кодах ошибок см. в разделе _doserrno, errno, _sys_errlist и _sys_nerr.

setvbuf Функция позволяет программе управления обоих буферизации и размер для буфера stream . stream должен ссылаться на открытый файл, который не проходил операции ввода-вывода с момента его открытия. Массив, на который указывает buffer используется в качестве буфера, если он не является NULL в этом случае setvbuf используется автоматически выделенный буфер длины size /2 * 2 байта.

Должен быть установлен режим _IOFBF , _IOLBF , или _IONBF . Если mode — _IOFBF или _IOLBF , затем size используется в качестве размера буфера. Если mode — _IONBF , небуферизованный поток и size и buffer учитываются. Значения для mode и их значений:

_IOFBF
Полная буферизация; то есть buffer используется в качестве буфера и size используется в качестве размера буфера. Если buffer — NULL , автоматически выделенный буфер size используется байт.

_IOLBF
Для некоторых систем это обеспечивает строки буферизации. Однако для Win32, поведение будет таким же, как _IOFBF -полная буферизация.

_IONBF
Буфер не используется, независимо от того, buffer или size .

Подпрограмма Обязательный заголовок
setvbuf

Дополнительные сведения о совместимости см. в разделе Совместимость во введении.

Описание функций C (Си) / C++ — setvbuf

Описание функций C (Си) / C++ — setvbuf

int setvbuf(stream, buf, type, size);

FILE *stream; указатель на структуру FILE
char *buf; буфер, назначенный пользователем.
int type тип буфера:
_IONBF — нет буфера;
_IOFBF — полная буферизация;
_IOLBF — строковая буферизация.
int size; размер буфера.

Функция setvbuf позволяет пользователю управлять буфериза-
цией и размером буфера для потока stream. Stream может ссылаться
на открытый файл. Массив, на который указывает buf, используется
как буфер, если он не является NULL, т.е. поток не является буфе-
ризованным. Если поток буферизованный, используется тип, опреде-
ленный по type; этот тип может быть либо _IONBF, либо _IOFBF, ли-
бо _IOLBF. Если используется тип _IOFBF, размер буфера определя-
ется по size; если используется тип _IOLBF или _IONBF, поток яв-
ляется небуферизованным, а size и buf игнорируются.

ЗНАЧЕНИЕ ТИПА ЕГО СМЫСЛ

_IONBF Буфер не используется, несмотря на
присутствие size и buf

_IOFBF Полная буферизация, если buf не яв-
ляется NULL; поэтому buf исполь-
зуется в качестве буфера, а size —
его размера

_IOLBF Аналогично _IOFBF

Истинное значение size обычно больше 0, но меньше макси-
мального целого размера.

Эта функция возвращает ненулевое значение, если тип или
размер буфера неправильно определен, и возвращает значение 0, ес-
ли все определено верно.
См. также setbuf, fflush, fopen, fclose.

FILE *stream1, *stream2;

<
stream1 = fopen(«data1», «r»);
stream2 = fopen(«data2», «w»);

/* Stream1 будет использовать буфер размером 1024 байта и
назначенный пользователем, а stream2 является небуферизованным */

if (setvbuf(stream1, buf, _IOFBF, sizeof(buf)) !=0)
printf(«Incorrect type or size of buffer1n»);
if (setvbuf(stream2, _IONBF, 0) != 0)
printf(«Incorrect type or size of buffer2n»);
>.

Илон Маск рекомендует:  Как использовать анимированный курсор
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL