Writing data into a text file - fprintf

조회 수: 1 (최근 30일)
Sila Dinc
Sila Dinc 2020년 9월 13일
댓글: Adam Danz 2020년 9월 14일
Hello,
I'm beginner and I'm trying to program an experiment but I can not write data into a text file.
I am using functions in the main file. In main m file there are outputs such as ReactionTime but the Matlab gives this error: Unrecognized function or variable 'ReactionTime'.
I'm sharing here the savedata function. Where do I do wrong?
Thank you.
function savedata()
%openfile
clear all;
answer{1} = '02';
filename1 = sprintf('Posner_%s.txt', answer{1});
filename2 = sprintf('%s\\%s', cd, filename1);
fid = fopen(filename2, 'wt');
fclose(fid);
%savedata
fprintf(fid, 'Reaction Time: %d', ReactionTime) ;
fclose(fid);
end

채택된 답변

Star Strider
Star Strider 2020년 9월 13일
Note that just after ‘filename2’ is opened, it is immediately closed:
fid = fopen(filename2, 'wt');
fclose(fid);
That could cause problems here:
%savedata
fprintf(fid, 'Reaction Time: %d', ReactionTime) ;
So even if ‘ReactionTime’ is defined and passed to the ‘savedata’ function as an argument (as it should be, rather than as a global variable), the function will throw this error:
Error using fprintf
Invalid file identifier. Use fopen to generate a valid file identifier.
I did that experiment to verify it.
For what it’s worth, I agree with others that global variables are not to be used. It is always possible to avoid using them by passing the variables as arguments to the functions using them.
.
  댓글 수: 13
Sila Dinc
Sila Dinc 2020년 9월 14일
Thank you!
Star Strider
Star Strider 2020년 9월 14일
As always, my pleasure!

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

추가 답변 (2개)

Adam Danz
Adam Danz 2020년 9월 13일
편집: Adam Danz 2020년 9월 13일
You need to pass the ReactionTime variable in as an input.
function savedata(ReactionTime)
. . .
%savedata
fprintf(fid, 'Reaction Time: %d', ReactionTime) ;
fclose(fid);
end
Also, to create filenames, instead of sprintf() use fullfile().
As Asad pointed out, the first fclose(fid) should be removed.
  댓글 수: 17
Sila Dinc
Sila Dinc 2020년 9월 14일
No, as I said I changed wt to a+ and the problem solved.
fid = fopen(filename2, 'a+');
Adam Danz
Adam Danz 2020년 9월 14일
Ah, good!
So now you know about permissions with the fopen function.

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


Asad (Mehrzad) Khoddam
Asad (Mehrzad) Khoddam 2020년 9월 13일
You should use variables like ReactionTime as global
Use this code after the function definition:
global ReactionTime cd
Use the same global command in the calling program
Also, the first fclose(fid); should not be used
  댓글 수: 2
Adam Danz
Adam Danz 2020년 9월 13일
편집: Adam Danz 2020년 9월 13일
There is rarely a good reason to use global variables and they usually cause more problems than they solve.
See #2
'cd' is probably the current directory command in which case it doesn't need to be passed in as a variable.
Asad is correct that the first fclose(fid) should be removed.
Stephen23
Stephen23 2020년 9월 13일
편집: Stephen23 2020년 9월 13일
You definitely should NOT use global variables.
Using global variables is bad advice in any programming language, and should be avoided in MATLAB too:
Using cd slows down code and makes debugging more difficult. The more efficient and recommended approach is to use absolute/relative filenames:

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

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by