Ввод-вывод

Стандартные потоки

Ниже я опишу, только самые часто используемые в прикладном программировании, удобные - высокоуровневые функции. Если вы чего-то не нашли - посмотрите в документацию (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.

results matching ""

    No results matching ""