入力バッファー
複数行の文字列
a ="""
10 200
abc def
xyz
"""
a は "10 200\nabc def\nxyz\n" という文字列と同じ。つまり,改行文字 "\n" が含まれる。
文字列を IO バッファーに設定する。
io = IOBuffer(a)
#=
IOBuffer(data=UInt8[...], readable=true, writable=false, seekable=true, append=false, size=19, maxsize=Inf, ptr=1, mark=-1)
=#
io から readlines() で,全てを入力する。
改行で区切って,文字列ベクトルとして入力される。
readlines(io)
#=
3-element Vector{String}:
"10 200"
"abc def"
"xyz"
=#
readline() では一行ずつ入力される。
io = IOBuffer(a)
readline(io) # "10 200"
readline(io) # "abc def"
readline(io) # "xyz"
readline(io) # "" 最終行まで読み込んだ後は空がかえされるだけ
前もって読み込む行がどのようになっているかわかっているなら,普通の readline(stdin) と同じように扱える。
io = IOBuffer(a)
parse.(Int, split(readline(io)))
#=
2-element Vector{Int64}:
10
200
=#
出力バッファー
IOBuffer で data 引数を省略すると出力バッファーになる。
io = IOBuffer()
#=
IOBuffer(data=UInt8[...], readable=true, writable=true, seekable=true, append=false, size=0, maxsize=Inf, ptr=1, mark=-1)
=#
出力バッファーに書き出すのは write() である。
write() するごとに,内容が追加される。改行文字は自動的には付かない。
write(io, "hello, world!")
write(io, "goodbye")
バッファーの中身を取り出すのは take!()。ただし,take!() で得られるのは Vector{UInt8} なので,普通の文字列にするには String() を適用する。
String(take!(io)) # "hello, world!goodbye"
取り出した後は,出力バッファーは空になる。
上に引き続いてすぐに。
String(take!(io)) # ""