How to store fprintf statements into a txt file?

조회 수: 7 (최근 30일)
Robert  Flores
Robert Flores 2019년 3월 25일
답변: Guillaume 2019년 3월 25일
Hello everyone,
I am trying to write an XML file that I can upload into ANSYS for a model I am trying to simulate. I am using fprintf statements to format the ouput, such that it maps out like an XML file. But, I wanna test what I am doing by outputing it into a .txt file; to see what it looks like. Also, I have been trying to use the writetable function, but maybe that is what is giving me an issue. If anyone can please help me it would be much appreciated, thanks.
Note: tt and ff are to make the values in my row matrix have commas in between each value. Also, I want to have the values in tt immediately follow the statement in the last fprintf statement, so it looks like the following:
<Data format="float">0,0.001,0.002,0.003,0.004,0.005,0.006,0.007,0.008,0.009,0.01,0.011,0.012,0.013....
clc, clear, close all
time = 0:0.001:9; x=time;
force = 1000*sin(x);
for i=1:numel(x)
if x(i) <= pi
force(i) = 1000*sin(x(i));
elseif (x(i) > pi)
force(i) = 0;
end
end
plot(x,force)
axis([0 5 0 1000])
title('Force v Time');xlabel('Time, measured in sec');ylabel('Force, measured in N')
Time = time';
tt = regexprep(num2str(time),'\s+',',');
Force = force';
ff = regexprep(num2str(force),'\s+',',');
Text = [fprintf('<?xml version="1.0" encoding="UTF-8" standalone="no" ?>\n');
fprintf('<ANSYS_EnggData>\n');
fprintf(' <MaterialData/>\n');
fprintf(' <ConvectionData/>\n');
fprintf(' <LoadVariationData>\n');
fprintf(' <MatML_Doc>\n');
fprintf(' <LoadVariation>\n');
fprintf(' <BulkDetails>\n');
fprintf(' <Name>Force</Name>\n');
fprintf(' <Form>\n');
fprintf(' <Description></Description>\n');
fprintf(' </Form>\n');
fprintf(' <PropertyData property="pr1">\n');
fprintf(' <Data format="float">',tt);]
writetable(Text,'Test.txt')
winopen('Test.txt')
  댓글 수: 2
dpb
dpb 2019년 3월 25일
I've never written/specifically read an XML file in my life but look at
doc xmlwrite % and friends
Looks like TMW has built some tools for the purpose...
dpb
dpb 2019년 3월 25일
If the above doesn't prove to be of real benefit, it's not difficult to write--just write the stuff you want directly to the file; you don't need to go thru writetable or any other intermediaries...
For the specific question, it would be simply
<Data format="float">0,0.001,0.002,0.003,0.004,0.005,0.006,0.007,0.008,0.009,0.01,0.011,0.012,0.013....

댓글을 달려면 로그인하십시오.

채택된 답변

Guillaume
Guillaume 2019년 3월 25일
  • You can pass a file identifier to fprintf (after you've opened the file), e.g.:
fid = fopen('Test.txt', 'wt');
fprintf(fid, 'Some text');
%...
fclose(fid);
  • You seem to be confusing fprintf with sprintf. The return value fprintf is the number of character written. So, at the end your Text variable is just an array of numbers: the number of characters you passed to each fprintf call. sprintf on the other hand, returns a char array. However, here you'd be better off just calling strjoin:
Text = strjoin(...
'<?xml version="1.0" encoding="UTF-8" standalone="no" ?>', ...
'<ANSYS_EnggData>', ...
...,
'\n'); %join all char vectors with newlines
  • writetable requires a table as the first input. A char array is not a table. Since writetable is a class member, most likely matlab will tell you the function does not exist a
  • s it is only in scope when one of the arguments is a table
In any case, rather than attempting to write your xml (with all the potential bugs that it entails), you should be using xmlwrite which is guaranteed to generate valid xml:
doc = com.mathworks.xml.XMLUtils.createDocument('ANSYS_EnggData');
root = doc.getDocumentElement;
root.appendChild(doc.createElement('MaterialData'));
root.appendChild(doc.createElement('ConvectionData'));
loadvardata = root.appendChild(doc.createElement('LoadVariationData'));
matml = loadvardata.appendChild(doc.createElement('MatML_Doc'));
loadvar = matml.appendChild(doc.createElement('LoadVariation'));
bulkdetail = loadvar.appendChild(doc.createElement('BulkDetails'));
name = bulkdetail.appendChild(doc.createElement('Name'));
name.appendChild(doc.createTextNode('Force'));
form = bulkdetail.appendChild(doc.createElement('Form'));
form.appendChild(doc.createElement('Description'));
pdata = doc.createElement('PropertyData');
pdata.setAttribute('property', 'pr1');
data = doc.createElement('Data');
data.setAttribute('format', 'float');
data.appendChild(doc.createTextNode(num2str(3.14)));
pdata.appendChild(data);
form.appendChild(pdata);
xmlwrite('Test.xml', root);

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Get Started with MuPAD에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by