Writing data into a text file - fprintf

10 次查看(过去 30 天)
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 个评论

请先登录,再进行评论。

更多回答(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+');

请先登录,再进行评论。


Asad (Mehrzad) Khoddam
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 中查找有关 Language Support 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by