How to store fprintf statements into a txt file?

7 Ansichten (letzte 30 Tage)
Robert  Flores
Robert Flores am 25 Mär. 2019
Beantwortet: Guillaume am 25 Mär. 2019
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 Kommentare
dpb
dpb am 25 Mär. 2019
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 am 25 Mär. 2019
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....

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Guillaume
Guillaume am 25 Mär. 2019
  • 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);

Weitere Antworten (0)

Kategorien

Mehr zu Get Started with MuPAD finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by