Новичок
Джуниор
Регистрация: 12.05.2022
Сообщений: 1
|
Matlab. Ошибка в коде.
Выдает ошибку, что индекс выходит за границы массива, но я не пойму какой индекс, все перепроверил, перешмалял и туда и сюда, не могу найти, подскажите пожалуйста.
Код:
% Написать программу, состоящую из трёх функций: главная функция с тестовыми данными и две локальные функции:
% - преобразование произвольной структуры (которая может содержать вложенные структуры) в файл в формате JSON.
% - преобразование файла в формате JSON в структуру MatLab/Octave.
% Не реализовывать весь стандарт (т.к. он огромен), а всего лишь базовую запись в файл и чтение обратно в MatLab/Octave.
% Программа должна учитывать отступы в соответствии с уровнем вложенности структур.
% Учесть, что числа должны храниться как числа (без кавычек), а строки как строки (в кавычках).
% Пример структуры:
% person = struct('firstName', 'Иван', 'lastName', 'Иванов', 'phoneNumber', '812 123-1234');
% person.address = struct('streetAddress', 'Московское ш., 101, кв.101', 'city', 'Ленинград', 'postalCode', 101101);
% Пример записи в JSON:
%
% {
% "firstName": "Иван",
% "lastName": "Иванов",
% "phoneNumber": "812 123-1234",
% "address": {
% "streetAddress": "Московское ш., 101, кв.101",
% "city": "Ленинград",
% "postalCode": 101101
% }
% }
% По возможности реализовать различные проверки на валидность JSON.
% Главная функция.
function format_json_new(stucture,varargin)
% Тестовые данные.
person = struct('firstName', 'Иван', 'lastName', 'Иванов', 'phoneNumber', '812 123-1234');
person.address = struct('streetAddress', 'Московское ш., 101, кв.101', 'city', 'Ленинград', 'postalCode', 101101);
person.orientation = 'getero';
person.hobby = struct('Sport', 'Voleyball', 'achievement', 'Master', 'Victories', 124);
person.character = struct('Introversion', 'ExtraVert', 'Temperament', 'Chorelic', 'IQ', 120);
position=0;
count_nesting=0;
count_if=0;
if nargin==0
% Реализация тестовых данных.
matlab_to_json_new(person,position,count_nesting,count_if);
else
% Релализация введённых данных.
matlab_to_json_new(stucture,position,count_nesting,count_if);
end
end
% Локальная функция перевода формата matlab/octave в json.
function matlab_to_json_new(structure,position,count_nesting,count_if)
% Cоздаем счётчик вложенности структур рекурсивной функции.
count_nesting=count_nesting+1;
% Загружаем исходные данные в массивы ячеек полей и их значений.
fields=fieldnames(structure);
for index=1:length(fields)
values_fields{index,:}=getfield(structure,fields{index,:}); %#ok<AGROW>
end
% Проверяем какие из полей являются структурами.
N=0;
for index=1:length(values_fields)
if isstruct(values_fields{index,:})==1
position_structure(index,:)=1; %#ok<AGROW>
else
position_structure(index,:)=0; %#ok<AGROW>
end
if position_structure(index,:)==1
N=N+1;
end
end
% Массив ячеек полей структур.
array_position_structure=[];
for index=1:length(values_fields)
if position_structure(index,:)==1
array_position_structure(index,:)=index; %#ok<AGROW>
end
end
array_position_structure(array_position_structure==0)=[];
for index=1:N
massive_structure{index,:}=values_fields{array_position_structure(index,:),:}; %#ok<AGROW>
end
% Создаем в формате записи файл, в котором будет содержаться json запись.
file_json=fopen("format_json.txt","r+");
% Заполнение файла format_json.txt.
fseek(file_json,position-1,"bof");
fprintf(file_json,'{\n');
for index=1:count_nesting*3
massive_space(1,index)=char(32); %#ok<AGROW>
end
for index=1:length(fields)
fprintf(file_json,massive_space);
% Заполняем значения только полей заданных строками.
if position_structure(index,:)==0
fprintf(file_json,['"',fields{index,:},'": "',values_fields{index,:},'"']);
fprintf(file_json,'\n');
else
fprintf(file_json,['"',fields{index,:},'": ']);
fprintf(file_json,'\n');
end
end
if count_nesting~=1
for index=1:(count_nesting-1)*3
massive_space_two(1,index)=char(32); %#ok<AGROW>
end
fprintf(file_json,massive_space_two);
end
fprintf(file_json,'}\n');
% Закрываем файл.
fclose(file_json);
% Открываем файл в формате записи и чтения.
file_json=fopen("format_json.txt","r+");
% Заполняем значения полей, которые не являются структурами.
fseek(file_json,0,"bof");
% Вводим счётчик строк.
count_line=0;
% Счётчик условий структур.
while feof(file_json)~=1
line=fgetl(file_json);
% Пропуск первой и последней строки, т.к. в строках только фигурные скобки.
if length(line)<2
continue
end
count_line=count_line+1;
% Находим поля заданные структурами.
disp(count_line);
if position_structure(count_line,:)==1
position=ftell(file_json);
count_if=count_if+1;
% Локальная функция, которая сохраняет все последующие строки в
% резервный файл.
position_carriage=ftell(file_json);
save_line(position_carriage);
del_line(position_carriage);
disp(massive_structure);
disp(count_if);
matlab_to_json_new(massive_structure{count_if,:},position,count_nesting);
file_end=fopen("format_json_backup_end.txt","r");
fclose(file_json);
file_json=fopen("format_json.txt","a");
fseek(file_end,0,"bof");
fseek(file_json,0,'eof');
while feof(file_end)~=1
line_end=fgetl(file_end);
fprintf(file_json,line_end);
fprintf('\n');
end
fclose(file_json);
file_json=fopen("format_json.txt","r+");
end
end
% % Закрываем файл.
fclose(file_json);
end
% Локальная функция сохранения последующих данных, начиная с положения каретки файла, в резервный файл.
function save_line(position_carriage)
file=fopen("format_json.txt","r");
% Создание резервного файла.
backup=fopen("format_json_backup_end.txt","w");
fseek(file,position_carriage,"bof");
while feof(file)~=1
line=fgetl(file);
fprintf(backup,line);
fprintf(backup,'\n');
end
% Закрытие резервного файла.
fclose(backup);
fclose(file);
end
% Локальная функция удаления последующих данных, начиная с положения
% каретки файла.
function del_line(position_carriage)
file=fopen("format_json.txt","r");
% Создание резервного файла.
backup=fopen("format_json_backup_start.txt","w");
fseek(file,0,"bof");
while feof(file)~=1
if ftell(file)==position_carriage
break
end
line=fgetl(file);
fprintf(backup,line);
fprintf(backup,'\n');
end
% Закрытие резервного файла.
fclose(backup);
fclose(file);
end
|