Чтение и запись bin и xml файлов¶
В данном примере мы сравним чтение файлов в формате bin и xml в Engee и MATLAB.
Начнём с бинарных файлов (bin). Они содержат необработанную структуру данных, что затрудняет их интерпретацию без специальных инструментов. Такие файлы состоят из потока байтов, которые могут представлять любые данные, будь то текст, изображения, аудио или видео. Эти данные хранятся в двоичной форме, что требует специальной обработки для извлечения нужной информации.
Основные особенности работы с бинарными файлами таковы.
- Формат данных: в бинарных файлах данные представлены последовательностью байтов, где каждый байт хранит одну единицу информации.
- Интерпретация данных: для понимания содержимого бинарного файла требуется знание его внутренней структуры. Без знания структуры данных программа не сможет корректно интерпретировать файл.
- Доступ к данным осуществляется путем чтения и записи отдельных байтов или блоков байтов. Программа должна знать, как интерпретатор будет обрабатывать эти данные.
Создадим бинарный файл для чтения.
Pkg.add(["EzXML"])
open("file.bin", "w") do io
write(io, Int32(12)) # Запишем целое число типа Int32
write(io, Float64(3.14)) # Запишем вещественное число типа Float64
write(io, "Test\n") # Запишем строку
end
Чтение бинарного файла в Engee:
open("file.bin", "r") do io
num_int = read(io, Int32) # Считаем целое число типа Int32
num_float = read(io, Float64) # Считаем вещественное число типа Float64
str = String(read(io)) # Считаем оставшуюся часть файла как строку
println("Целое число: ", num_int)
println("Вещественное число: ", num_float)
print("Прочитанная строка: ", str)
end
Чтение бинарного файла в MATLAB:
using MATLAB
mat"""
fileID = fopen('file.bin', 'rb');
num_int = fread(fileID, 1, 'int32');
num_float = fread(fileID, 1, 'double');
str = fscanf(fileID, '%c');
fclose(fileID);
"""
mat"""fprintf('Прочитанные целые числа: ');
disp(num_int);"""
mat"""fprintf('Прочитанные вещественные числа: ');
disp(num_float);"""
mat"""disp(['Прочитанная строка: ', str]);"""
Хотя тесты показывают, что код получился однотипным, различия между языками проявляются в том, что синтаксис Engee более прост и интуитивно понятен. Кроме того, типы данных в Engee проще воспринимать, поскольку концепция «double» отсутствует.
Тепреь перейдём к XML-файлам (xml). Они предназначены для хранения структурированных данных в виде дерева. Каждый элемент XML-файла имеет свой тег, который определяет тип данных, содержащихся в этом элементе. Это облегчает работу с такими файлами, так как программы могут анализировать структуру файла и извлекать нужные данные.
Основные особенности работы с XML-файлами таковы.
- Структура данных: XML-файл представляет собой дерево, в котором каждый элемент (тег) содержит информацию о типе данных и структуре.
- Иерархическая структура: XML-файл организует данные в виде древовидной структуры, где каждый элемент имеет родителя и потомков.
- Разметка: XML-файл включает разметку, которая определяет, как данные организованы. Это упрощает обработку данных, и программа знает, как обращаться с каждым элементом.
Самый простой вариант прочитать такие файлы – это использовать строчное представление. Для детального анализа таких файлов в Engee имеется библиотека EzXML. А MATLAB использует Java API для работы с XML, так как встроенных средств для этого нет.
Pkg.add("EzXML")
using EzXML
using EzXML
doc = parsexml("""
<primates>
<genus name="Homo">
<species name="sapiens">Human</species>
</genus>
<genus name="Pan">
<species name="paniscus">Bonobo</species>
<species name="troglodytes">Chimpanzee</species>
</genus>
</primates>
""")
# Сохраняем документ в файл
write("file.xml", doc)
Чтение XML-файла в Engee:
open("file.xml", "r") do io
str = String(read(io))
println(str)
end
Чтение XML-файла в MATLAB:
mat"""
fileID = fopen('file.xml', 'rb');
disp(fscanf(fileID, '%c'));
"""
Вывод¶
В этом примере мы изучили, как производятся запись и чтение бинарных файлов и XML-документов на обоих языках программирования. Как видно из этого разбора, синтаксические и функциональные преимущества в данном направлении на стороне Engee.