Ввод-вывод
Стандартные потоки
Ниже я опишу, только самые часто используемые в прикладном программировании, удобные - высокоуровневые функции. Если вы чего-то не нашли - посмотрите в документацию (http://docs.julialang.org/en/stable/stdlib/io-network/).
Три стандартных потока, доступны программе по умолчанию: стандартный ввод STDIN, стандартный вывод STDOUT, и стандартный вывод ошибок STDERR.
Функции print
, println
печатают свои аргументы на STDOUT:
echo -e "abc\ndfg" | julia -e'for l in eachline(STDIN) println("Строка $(chomp(l)) получена.") end'
Строка abc получена.
Строка dfg получена.
В вышеприведенном примере строка "abc"+перенос строки+"dfg" из командной оболочки bash
перенаправлена на STDIN
программе julia. Здесь функция eachline
считывает данные из STDIN
построчно, присваивая (в каждую итерацию цикла for
) результат переменной l
. Функция chomp
каждую такую строчку обрезает с конца, удаляя перенос строки. Функция println
печатает новую строку, состоящую из текста "Строка ... получена." со вставленным в середину "abc", а потом "dfg", добавляя в конец каждой строчки перевод строки. Обратите внимание на интерполяцию выражения chomp(l)
внутри двойных кавычек с помощью синтаксиса $()
.
В STDERR пишут функции error
, warn
, info
.
Прочитать одну строку из потока можно функцией readline
.
Все строки в массив - readlines
.
Весь текст из открытого потока или файла как есть - readstring
.
Весь текст с удалением последнего переноса - readchomp
.
Получить итератор по строкам, чтобы использовать его в цикле - eachline
.
Прочитать структурированный текст с разделителем в матрицу - readdlm
и readcsv
описание не привожу. См. доку.
Примеры использования будут в тексте.
open
Функция open
имеет несколько реализаций. Одна из них:
open(filename[, mode]) → IOStream
Аналог дружественной к пользователю из cfopen(3)
и open
из Perl:
Режим | Описание |
---|---|
r | только чтение |
r+ | чтение, запись |
w | запсь, создание (в случае отсутствия), перезапись |
w+ | чтение, запись, создание, перезапись |
a | запись, создание, дозапись |
a+ | чтение, запись, создание, дозапись |
возвращает объект IOStream
, который потом нужно будет закрыть явным вызовом close
. Вызов close
автоматически вызывает flush
- сброс буфера.
join(io, items, delim[, last])
Записывает в поток io
объединенные в одну строку елементы items
с разделителем delim
. Если указан last
, то с помощью него последний элемент будет объединен с предыдущим.
Пример:
julia> join(STDOUT, [2,"ab",4,"cd","\n"],"*","")
2*ab*4*cd
Использование этой функции предпочтительнее, чем такой вариант:
julia> # неоптимально, если важна производительность:
julia> println(join([2,"ab",4,"cd"],"*"))
2*ab*4*cd
потому что последний сначала выделяет память под объединенную строку, а потом ее записывает, что снижает производительность, а в случае большой коллекции items
- еще и неоптимально использует память.
Функция же join
(с первым параметром IO) записывает элементы прямо в поток один за другим, материализуя их по необходимости из итератора (если они не материализованы), пока они не кончатся.
Вот доказательства:
julia> g1 = ((print("(realise $i)");i) for i in 1:3)
Base.Generator{UnitRange{Int64},##17#18}(#17,1:3)
julia> join(STDOUT, g1 ,"*" )
(realise 1)1*(realise 2)2*(realise 3)3
julia> println(join( g1 ,"*" ))
(realise 1)(realise 2)(realise 3)1*2*3
show(x)
Записывает информативную текстовое представление значения в текущий (или указанный) поток вывода. Когда вы определяете свой тип данных. Именно эту функцию нужно переопределить, если вы хотите поменять текстовое представление вашего нового типа, которое используется и в REPL для отображения результата и внутри двойных кавычек (интерполяция в строке). Переопределять нужно функцию с сигнатурой show(io,x)
. Julia создаст представление по умолчанию, если вы не сделаете этого.
Пример. Создадим свой тип кота:
julia> # this is REPL session 1
julia> type Cat
name::AbstractString
fat::Bool
end
julia> mycat = Cat("Vasya",true)
Cat("Vasya",true)
julia> mycat|>println
Cat("Vasya",true) # автоматически созданное текстовое представление
Так как julia уже скомпилировала вариант show(STDOUT,Cat)
, придется выйти из REPL и зайти заново, чтобы попробовать переопределенную функцию.
julia> # session 2
julia> type Cat
name::AbstractString
fat::Bool
end
julia> Base.show(io::IO,c::Cat) = print(io, (c.fat ? "Fat " : "")*"cat "*c.name)
julia> mycat = Cat("Vasya",true)
Fat cat Vasya # здесь REPL вызывает show
julia> mycat|>println
Fat cat Vasya # - println неявно вызывает show
Если переопределить Base.string()
, то получите только переопределенные string()
и интерполяцию в строке.
print_with_color(color::Symbol, [io, ]strings...)
Печатает строку/строки указанным цветом.
Параметр color
может иметь одно из значений :normal, :bold, :black, :blue, :cyan, :green, :magenta, :red, :white, or :yellow
.
Пример:
print_with_color( :magenta, STDERR, """Hello\n""")
@printf([io::IOStream, ]"%Fmt", args...)
Аналог c-функции printf
.
@sprintf("%Fmt", args...)
Возвращает строку, форматированную с помощью @printf.