fconfigure
-
НАЗВАНИЕ
- fconfigure — Установка и получение параметров канала
- СИНТАКСИС
- ОПИСАНИЕ
-
-blocking boolean
- -buffering newValue
- -buffersize newSize
- -encoding name
- -eofchar char
- -eofchar {inChar outChar}
- -translation mode
- -translation {inMode outMode}
-
auto
- binary
- cr
- crlf
- lf
- binary
- -buffering newValue
Имя
fconfigure — Установка и получение параметров каналаСинтаксис
fconfigure channelIdfconfigure channelIdname
fconfigure channelIdname value ?name value ...?
Описание
Команда fconfigure устанавливает и извлекает параметры каналов.ChannelId идентифицирует канал, для которого необходимо установить или запросить параметр, и должен ссылаться на открытый канал, такой как стандартный Tcl-канал (stdin, stdout или stderr), результат вызова open или socket, или результат команды создания канала, предоставленной Tcl-расширением.
Если аргументы name или value не указаны, команда возвращает список, содержащий чередующиеся имена и значения параметров канала. Если name указан, но value нет, команда возвращает текущее значение заданного параметра. Если указана одна или несколько пар name и value, команда устанавливает каждый именованный параметр в соответствующее значение value; в этом случае возвращаемое значение — пустая строка.
Ниже описаны поддерживаемые параметры для всех каналов. Кроме того, каждый тип канала может добавлять поддерживаемые им параметры. См. справку по команде, которая создаёт каждый тип каналов, для параметров, поддерживаемых этим конкретным типом канала. Например, см. справку по команде socket для дополнительных параметров для сокетов и команду open для дополнительных параметров для последовательных устройств.
- -blocking boolean
- Опция -blocking определяет, могут ли операции ввода-вывода на канале привести к неограниченному блокированию процесса. Значение опции должно быть истинным или ложным значением. Каналы обычно работают в режиме блокировки; если канал переведён в режим без блокировки, это повлияет на работу команд gets, read, puts, flush и close, позволив им работать асинхронно; см. документацию по этим командам для получения подробной информации. Для корректной работы режима без блокировки приложение должно использовать цикл обработки событий Tcl (например, вызывая Tcl_DoOneEvent или вызывая команду vwait).
- -buffering newValue
- Если newValue равно full, то система ввода-вывода будет буферизовать вывод, пока её внутренний буфер не заполнится или пока не будет вызвана команда flush. Если newValue равно line, то система ввода-вывода автоматически будет очищать вывод при каждом выводе символа новой строки. Если newValue равно none, система ввода-вывода будет очищать буфер автоматически после каждой операции вывода. По умолчанию -buffering устанавливается в full, за исключением каналов, подключённых к устройствам, похожим на терминалы; для этих каналов начальное значение равно line. Кроме того, stdin и stdout изначально установлены в line, а stderr установлен в none.
- -buffersize newSize
- Newvalue должно быть целым числом; его значение используется для установки размера буферов в байтах, которые впоследствии выделяются для этого канала для хранения входных или выходных данных. Newvalue должно находиться в диапазоне от одного до одного миллиона, что позволяет создавать буферы размером от одного до одного миллиона байтов.
- -encoding name
- Эта опция используется для указания кодировки канала, чтобы данные можно было преобразовать в Unicode и из него для использования в Tcl. Например, чтобы Tcl мог читать символы из японского файла в кодировке shiftjis и корректно обрабатывать и отображать содержимое, кодировка должна быть установлена в shiftjis. После этого при чтении из канала байты в японском файле будут преобразовываться в Unicode по мере чтения. Поддерживается также запись — при записи строк Tcl в канал они автоматически будут преобразовываться в указанную кодировку на выходе.
Если файл содержит чисто двоичные данные (например, изображение JPEG), кодировка канала должна быть настроена на binary. Тогда Tcl не будет интерпретировать данные в файле и просто будет читать или записывать сырые байты. Команда Tcl binary может использоваться для манипулирования этими данными, ориентированными на байты. Обычно лучше установить опцию -translation в binary при передаче двоичных данных, так как это отключает другие автоматические интерпретации байтов в потоке как таковых.
По умолчанию кодировка вновь открытых каналов совпадает с зависимой от платформы и локали системной кодировкой, используемой для взаимодействия с операционной системой, как возвращается командой encoding system.
- -eofchar char
- -eofchar {inChar outChar}
- Эта опция поддерживает файловые системы DOS, которые используют Control-z (\x1a) в качестве маркера конца файла. Если char не пустая строка, то этот символ сигнализирует об окончании файла при его обнаружении во время ввода. Для вывода символ конца файла выводится при закрытии канала. Если char — пустая строка, то нет специального маркера конца файла. Для каналов чтения-записи двухелементный список указывает маркер конца файла для ввода и вывода соответственно. Для удобства при настройке символа конца файла для канала чтения-записи можно указать одно значение, которое будет применяться как для чтения, так и для записи. При запросе символа конца файла для канала чтения-записи всегда будет возвращаться двухелементный список. По умолчанию значение -eofchar — пустая строка во всех случаях, кроме файлов под управлением Windows. В этом случае -eofchar равен Control-z (\x1a) для чтения и пустой строке для записи. Допустимый диапазон значений -eofchar — \x01 - \x7f; попытка установить -eofchar со значением вне этого диапазона приведёт к ошибке.
- -translation mode
- -translation {inMode outMode}
- В скриптах Tcl конец строки всегда представляется одним символом новой строки (\n). Однако в реальных файлах и устройствах конец строки может представляться по-разному на разных платформах или даже для разных устройств на одной и той же платформе. Например, под UNIX в файлах используются новые строки, тогда как в сетевых подключениях обычно используется последовательность возврат каретки-перевод строки. При вводе (т.е. с помощью gets и read) система ввода-вывода Tcl автоматически преобразует внешнее представление конца строки в символы новой строки. При выводе (т.е. с помощью puts) система ввода-вывода преобразует новые строки во внешнее представление конца строки. Режим преобразования по умолчанию, auto, автоматически обрабатывает все распространённые случаи, но опция -translation предоставляет явный контроль над преобразованиями конца строки.
Значение, связанное с -translation, является одним значением для каналов только для чтения и только для записи. Для каналов чтения-записи значение является двухелементным списком; режим преобразования для чтения — первый элемент списка, а режим преобразования для записи — второй. Для удобства при настройке режима преобразования для канала чтения-записи можно указать одно значение, которое будет применяться как для чтения, так и для записи. При запросе режима преобразования для канала чтения-записи всегда будет возвращаться двухелементный список. В настоящее время поддерживаются следующие значения:
- auto
- В качестве режима преобразования для ввода auto обрабатывает любой из режимов новой строки (lf), возврата каретки (cr) или возврата каретки, за которым следует перевод строки (crlf) как представление конца строки. Представление конца строки может даже меняться от строки к строке, и все случаи преобразуются в новую строку. В качестве режима преобразования для вывода auto выбирает представление, специфичное для платформы; для сокетов на всех платформах Tcl выбирает crlf, для всех версий Unix — lf, а для различных версий Windows — crlf. Значение по умолчанию для -translation равно auto как для ввода, так и для вывода.
- binary
- Преобразования конца строки не выполняются. Это почти идентично режиму lf, за исключением того, что в режиме binary также устанавливается символ конца файла в пустую строку (что отключает его) и кодировка в binary (что отключает фильтрацию кодировки). См. описание -eofchar и -encoding для получения дополнительной информации.
Внутренне, т.е. в отношении фактического поведения переводчика, это значение равно значению lf и поэтому сообщается как таковое при запросе. Даже если binary использовалось для установки преобразования.
- cr
- Конец строки в базовом файле или устройстве представляется одним символом возврата каретки. В режиме cr режим преобразования преобразует возвраты каретки в символы новой строки. В режиме вывода cr режим преобразования преобразует символы новой строки в возвраты каретки.
- crlf
- Конец строки в базовом файле или устройстве представляется символом возврата каретки, за которым следует символ перевода строки. В режиме crlf режим преобразования преобразует последовательности возврат каретки-перевод строки в символы новой строки. В режиме вывода crlf режим преобразования преобразует символы новой строки в последовательности возврат каретки-перевод строки. Этот режим обычно используется на платформах Windows и для сетевых подключений.
- lf
- Конец строки в базовом файле или устройстве представляется одним символом новой строки (перевода строки). В этом режиме преобразования не выполняются ни при вводе, ни при выводе. Этот режим обычно используется на платформах UNIX.
Стандартные каналы
Стандартные каналы Tcl (stdin, stdout и stderr) могут настраиваться с помощью этой команды, как и любой другой канал, открытый библиотекой Tcl. Помимо стандартных опций, описанных выше, они также будут поддерживать любые специальные опции в соответствии с их текущим типом. Например, если приложение Tcl запускается суперсервером inet, распространённым в системах Unix, его стандартные каналы Tcl будут сокетами и, следовательно, будут поддерживать опции сокета.Примеры
Инструктирование Tcl для отправки вывода всегда в stdout немедленно, независимо от того, идёт ли речь об устройстве терминала:fconfigure stdout -buffering none
Открытие сокета и чтение строк из него без блокировки обработки других событий:
set s [socket some.where.com 12345]
fconfigure $s -blocking 0
fileevent $s readable "readMe $s"
proc readMe chan {
if {[gets $chan line] < 0} {
if {[eof $chan]} {
close $chan
return
}
# Could not read a complete line this time; Tcl's
# internal buffering will hold the partial line for us
# until some more data is available over the socket.
} else {
puts stdout $line
}
} Чтение изображения в формате PPM из файла:
# Open the file and put it into Unix ASCII mode
set f [open teapot.ppm]
fconfigure $f -encoding ascii -translation lf
# Get the header
if {[gets $f] ne "P6"} {
error "not a raw-bits PPM"
}
# Read lines until we have got non-comment lines
# that supply us with three decimal values.
set words {}
while {[llength $words] < 3} {
gets $f line
if {[string match "#*" $line]} continue
lappend words {*}[join [scan $line %d%d%d]]
}
# Those words supply the size of the image and its
# overall depth per channel. Assign to variables.
lassign $words xSize ySize depth
# Now switch to binary mode to pull in the data,
# one byte per channel (red,green,blue) per pixel.
fconfigure $f -translation binary
set numDataBytes [expr {3 * $xSize * $ySize}]
set data [read $f $numDataBytes]
close $f См. также
close, flush, gets, open, puts, read, socket, Tcl_StandardChannels
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/fconfigure.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/fconfigure.htm