# IO write/read \<strlen\> \<string\>

**URL:** <https://discourse.julialang.org/t/io-write-read-strlen-string/66362>\
**Category:** General Usage\
**Tags:** binaryio, strings, io\
**Created:** [August 13, 2021, 8:49pm UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362 "2021-08-13T20:49:04Z")\
**Posts on this page:** 16\
**Page:** 1

<div class="post-metadata">

**Author:** ![Bardo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bardo/32/21601_2.png) [@Bardo](https://discourse.julialang.org/u/Bardo)\
**Post date:** [August 13, 2021, 8:49pm UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362/1 "2021-08-13T20:49:04Z")

</div>

With the suggestions below:

```julia
# write number as type T
function writenum(io, num, T)
    write(io, T(num))
end
# read n numbers of type T
function readnum(io, T, n)
    s = sizeof(T)
    f = zeros(UInt8, s*n)
    readbytes!(io, f, s*n)
    return reinterpret(T, f)
end
# read single number of type T
function readnum(io, T)
    s = sizeof(T)
    f = zeros(UInt8, s)
    readbytes!(io, f, s)
    return reinterpret(T, f)[1]
end
# write string
function writestr(io, str)
    write(io, codeunits(str))
end
# read string of length n
function readstr(io, n)
    return String(read(io, n))
end

# Test

io = open("io.bin", "w")
snd = "abc"
nsnd = length(snd)
writenum(io, nsnd, UInt8)
writestr(io, snd)
close(io)

io = open("io.bin", "r")
nrcv = readnum(io, UInt8)
rcv = readstr(io, nrcv)
close(io)

(nrcv == nsnd) && (snd == rcv)

```

---

<div class="post-metadata">

**Author:** ![pdeffebach](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pdeffebach/32/10320_2.png) [@pdeffebach](https://discourse.julialang.org/u/pdeffebach)\
**Post date:** [August 13, 2021, 8:53pm UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362/2 "2021-08-13T20:53:28Z")

</div>

This post has lots of information: [Introducing Julia/Working with text files - Wikibooks, open books for an open world](https://en.wikibooks.org/wiki/Introducing_Julia/Working_with_text_files)

What are you trying to do exactly?

---

<div class="post-metadata">

**Author:** ![Bardo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bardo/32/21601_2.png) [@Bardo](https://discourse.julialang.org/u/Bardo)\
**Post date:** [August 13, 2021, 9:05pm UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362/3 "2021-08-13T21:05:21Z")

</div>

Thx for staying with me!  
I consulted this doc, it does read/write a whole file, a line, using delimiters, but not the case I am looking for, a single string.  
The whole is for a serializer and inter-process communication. There are of course already proven packages. I use it as a learning vehicle (getting around…) and hope to come up with something faster, using a small set of homogeneous object types.

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [August 13, 2021, 10:51pm UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362/4 "2021-08-13T22:51:32Z")

</div>

to read a single string with known length:

```julia
String(read(io, N))

```

---

<div class="post-metadata">

**Author:** ![tomerarnon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tomerarnon/32/3170_2.png) [@tomerarnon](https://discourse.julialang.org/u/tomerarnon)\
**Post date:** [August 14, 2021, 12:42am UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362/5 "2021-08-14T00:42:29Z")

</div>

Not sure what you mean by more elegant. Is the `do` syntax from the first help example more elegant for your use case?

```julia
 open(f::Function, args...; kwargs....)

  Apply the function f to the result of open(args...; kwargs...) and close the resulting file descriptor upon completion.

  Examples
  ≡≡≡≡≡≡≡≡≡≡

  julia> open("myfile.txt", "w") do io
             write(io, "Hello world!")
         end;
  
  julia> open(f->read(f, String), "myfile.txt")
  "Hello world!"
  
  julia> rm("myfile.txt")

```

---

<div class="post-metadata">

**Author:** ![Bardo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bardo/32/21601_2.png) [@Bardo](https://discourse.julialang.org/u/Bardo)\
**Post date:** [August 14, 2021, 5:32am UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362/6 "2021-08-14T05:32:14Z")

</div>

By elegant, I meant unified, concise or built-in for reading a number or a string.  
The elegance of your example is in opening and closing a file.

---

<div class="post-metadata">

**Author:** ![Bardo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bardo/32/21601_2.png) [@Bardo](https://discourse.julialang.org/u/Bardo)\
**Post date:** [August 14, 2021, 5:42am UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362/7 "2021-08-14T05:42:13Z")

</div>

> [@jling](#):
>
> `String(read(io, N))`

Nice! Now if we could do the same with

```julia
UInt8(read(io, 1))

```

but such a method does not exist. How to write it?

---

<div class="post-metadata">

**Author:** ![tomerarnon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tomerarnon/32/3170_2.png) [@tomerarnon](https://discourse.julialang.org/u/tomerarnon)\
**Post date:** [August 14, 2021, 6:29am UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362/8 "2021-08-14T06:29:11Z")

</div>

To read a String as a series of bytes, you can use transcode:

```julia
julia> open("io.bin") do io
           str = read(io, String)
           transcode(UInt8, str)
       end
3-element Base.CodeUnits{UInt8, String}:
 0x61
 0x62
 0x63

```

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [August 14, 2021, 8:58am UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362/10 "2021-08-14T08:58:56Z")

</div>

read(io, UInt8)

?

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [August 14, 2021, 9:14am UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362/11 "2021-08-14T09:14:39Z")

</div>

> [@rafael.guerra](#):
>
> but the numeric arrays that follow seem to get messed up. It works fine if writing each char though.

```julia
julia> open("./test", "w") do io1
           write(io1, "length7")
           write(io1, [1,2,3])
       end
24

julia> open("./test") do io2
           @show String(read(io2, 7))
           @show reinterpret(Int64, read(io2))
       end
String(read(io2, 7)) = "length7"
reinterpret(Int64, read(io2)) = [1, 2, 3]

```

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [August 14, 2021, 9:36am UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362/12 "2021-08-14T09:36:00Z")

</div>

@jling, thank you.  
Would like to take my question back as cannot reproduce the problem any longer.  
Not sure what went wrong while testing code below.

> **Test code: binary io**
>
> ```julia
> x = [π, sqrt(2), 1.0, 0.0]
> nx = length(x)
> Y = x*x'
> nY, mY = size(Y)
> str = "flag nx nY mY x Y"
> slen = length(str)
> 
> # BINARY WRITE:
> filename = "x_Y_binary_out.dat"
> open(filename,"w") do io
> write(io, 'F') #Char Flag
> write(io, str)
> write(io, nx, nY, mY, x, Y)
> end
> 
> # BINARY READ:
> io = open(filename,"r")
> flagchar = Char(read(io, UInt8))
> str2 = String(read(io, slen))
> nx2 = read(io,Int64)
> nY2 = read(io,Int64)
> mY2 = read(io,Int64)
> x2 = Vector{Float64}(undef,nx2)
> read!(io,x2)
> Y2 = Array{Float64}(undef,(nY2,mY2))
> read!(io,Y2)
> close(io)
> 
> ```

---

<div class="post-metadata">

**Author:** ![Bardo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bardo/32/21601_2.png) [@Bardo](https://discourse.julialang.org/u/Bardo)\
**Post date:** [August 17, 2021, 9:50am UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362/13 "2021-08-17T09:50:30Z")

</div>

Interestingly, with the do form I learned that it creates a scope, making it less usable to get the information “out”.

```julia
function round_trip(data)
    open("io.bin", "w") do io
        serialize(io, data)
    end

    io = open("io.bin", "r")
    data2 = deserialize(io)
    println("data2=$data2")

    open("io.bin", "r") do io
        data3 = deserialize(io)
        println("data3=$data3")
    end
    println("data3=$data3")
end

data = ("Ab", [pi, 2.0])
round_trip(data)

```

```julia
data2=("Ab", [3.141592653589793, 2.0])
data3=("Ab", [3.141592653589793, 2.0])
ERROR: LoadError: UndefVarError: data3 not defined

```

---

<div class="post-metadata">

**Author:** ![tomerarnon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tomerarnon/32/3170_2.png) [@tomerarnon](https://discourse.julialang.org/u/tomerarnon)\
**Post date:** [August 17, 2021, 10:19am UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362/14 "2021-08-17T10:19:23Z")

</div>

Indeed, it’s a new scope, but you can do

```julia
data3 = open("io.bin", "r") do io
    deserialize(io)
end

```

Additionally, `do` is a just a way of passing a function as the first argument to another function. So we can equivalently do:

```julia
data3 = open(io -> deserialize(io), "io.bin", "r")

```

And then simplify to

```julia
data3 = open(deserialize, "io.bin", "r")

```

---

<div class="post-metadata">

**Author:** ![Bardo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bardo/32/21601_2.png) [@Bardo](https://discourse.julialang.org/u/Bardo)\
**Post date:** [August 17, 2021, 10:42am UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362/15 "2021-08-17T10:42:34Z")

</div>

For a novice like me, pure magic - thx a lot for these lines!  
Can you recommend a book or other text to get familiar with such things?

The manual states

```julia
do
Create an anonymous function and pass it as the first argument to a function call. For example:

map(1:10) do x
    2x
end
is equivalent to map(x->2x, 1:10).

```

OK for the do now.  
The second and third form are due to (specific I guess) Julia syntax for open():

> You can call:

```julia
julia> open(read_and_capitalize, "hello.txt")
"HELLO AGAIN."

```

> to open hello.txt, call read\_and\_capitalize on it, close hello.txt and return the capitalized contents.

RTFM.

---

<div class="post-metadata">

**Author:** ![tomerarnon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tomerarnon/32/3170_2.png) [@tomerarnon](https://discourse.julialang.org/u/tomerarnon)\
**Post date:** [August 17, 2021, 7:59pm UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362/16 "2021-08-17T19:59:13Z")

</div>

Personally, I am not familiar with any of the julia books out there. I suggest reading the [julia manual](https://docs.julialang.org/en/v1/) though. In particular, read the “Manual” section of the documentation (potentially excluding sections that seems irrelevant at the moment – e.g. asynchronous programming, if that isn’t important to you). Then also read the “Documentation” section. Everything up through Iteration Utilities. Beyond that, you might also need to look through sections of Standard Library documentation, as necessary. Going through all of this will expose you to a lot of aspects of julia you aren’t yet familiar with, and help explain ones you’re not yet clear about.

---

<div class="post-metadata">

**Author:** ![Bardo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bardo/32/21601_2.png) [@Bardo](https://discourse.julialang.org/u/Bardo)\
**Post date:** [August 17, 2021, 8:24pm UTC](https://discourse.julialang.org/t/io-write-read-strlen-string/66362/17 "2021-08-17T20:24:27Z")

</div>

Thanks for the reading recommendations.
