Итак, Богумил прав, это немного глупо, но если вы заинтересованы в записи и чтении в двоичные файлы, то здесь есть реализация для чтения и записи Vector{String}
, которая работает путем преобразования каждого String
в * 1003.*, затем записывает каждый Vector{UInt8}
в файл, используя начальные значения Int64
для каждого Vector{UInt8}
, чтобы сохранить его длину.Файл также начинается с дополнительного Int64
, в котором хранится длина Vector{String}
.Затем процедуры чтения используют эту информацию, чтобы вернуть все обратно и преобразовать обратно в Vector{String}
:
my_write(fid1::IOStream, x::Vector{UInt8}) = begin ; write(fid1, Int64(length(x))) ; write(fid1, x) ; end
my_write(fid1::IOStream, x::Vector{Vector{UInt8}}) = begin ; write(fid1, Int64(length(x))) ; [ my_write(fid1, y) for y in x ] ; end
my_read(fid1::IOStream, ::Type{Vector{UInt8}})::Vector{UInt8} = begin i = read(fid1, Int64) ; [ read(fid1, UInt8) for a = 1:i ] ; end
my_read(fid1::IOStream, ::Type{Vector{Vector{UInt8}}})::Vector{Vector{UInt8}} = begin i = read(fid1, Int64) ; [ my_read(fid1, Vector{UInt8}) for a = 1:i ] ; end
my_write(myfilepath::String, x::Vector{String}) = open(fid1 -> my_write(fid1, [ Vector{UInt8}(codeunits(y)) for y in x ]), myfilepath, "w")
function my_read(myfilepath::String, ::Type{Vector{String}})::Vector{String}
x = open(fid1 -> my_read(fid1, Vector{Vector{UInt8}}), myfilepath, "r")
return [ String(y) for y in x ]
end
Возможно, я включил немного больше информации о типе, чем необходимо, но это может привести кнемного более очевидным для вас.Кроме того, извините, у меня есть плохая привычка делать подобные вещи с однострочником, но вы можете легко распаковать их при необходимости.Вот некоторый тестовый код (просто измените путь к файлу):
myfilepath = "/home/colin/Temp/test_file.bin"
x = ["abc", "de", "f", "", "ghij"]
my_write(myfilepath, x)
my_read(myfilepath, Vector{String})
Обратите внимание, что с небольшим усилием этот код можно сделать более общим, так что он будет работать практически для любого Vector{Vector{T}}
до тех пор, покакак T
доступно для записи.На самом деле, если вы действительно умны, его можно обобщить на любой Vector{Vector{Vector{...{T}}}}
, если вы можете правильно понять рекурсию.