for loop, write to text file, append, sprintf, fprintf
60 次查看(过去 30 天)
显示 更早的评论
Hi, I want to make a for_loop that adds lines to a text file.
first loop: direction_lights_1 = [1 2 3] second loop: direction_lights_2 = [4 5 6] ... fifth loop: direction_lights_5 = [13 14 15]
My code so far looks like this:
fileID = fopen(sprintf('textfile.txt','w'); %here I create the text file
fprintf(fileID, '%f %f %f \n', direction_lights); %here I print the 3 numbers and then go to a new line
fclose(fileID);
Now I want the program to append lines to the existing text file. It should look somewhat like this:
for i=1:5 %obviously open the file again
fprintf(fileID, '%f %f %f \n', direction_lights_i.'a');
end
I can't figure out how to make it work. Hope it is clear what I'm trying to achieve. Thanks for your help! J
采纳的回答
Jan
2017-6-23
编辑:Jan
2017-6-23
fileID = fopen('textfile.txt', 'a');
for i=1:5
fprintf(fileID, '%f %f %f \n', direction_lights_i);
end
fclose(fileID);
The 'a' belongs to the fopen command, not to fprintf.
4 个评论
Jan
2017-6-23
编辑:Jan
2017-6-23
:-) This is really funny! What a STRANGE output!!! :-)
But exactly as expected: These are the ASCII codes of the string 'direction_lights_1' - see:
double('direction_lights_1')
What is the prupose of
direction_lights_i = sprintf('direction_lights_%i',i);
? This creates a string, a CHAR vector. But it does not access the variable with the same name magically. Do not confuse the contents with the name of a variable. These are 2 different things.
What you want to use is the evil eval: This command evaluates the contents of a string as code. We discuss this nearly once a day here, because it is the evergreen of bad programming patterns. See e.g. this exhaustive overview: Answers: Don't eval!
Do not hide indices in the names of a variable, but use an index instead. There are some more problems in your code:
% Why? Do you have a good reason for a brutal clearing?
clc; close all; clear;
folder = cd; % Set it accordingly
name_object = 'test';
num_lights = '12'; % Now this is a string already
% Create an array, e.g. a cell array, instead of hiding
% an index in the names:
direction_lights{1} = [1 2 3];
direction_lights{2} = [4 5 6];
direction_lights{3} = [7 8 9];
filename = fullfile(folder, sprintf('lights_%s.txt', name_object));
fileID = fopen(filename, 'w');
% I've seen too many problems in this forum caused by
% unsuccessful opening of files without noticing this:
if fileID == -1, error('Cannot open file: %s', filename); end
% num_lights is a string already, then |str2double| is
% not useful as indirection:
fprintf(fileID, '%s\n', num_lights);
% No, leave the file open:
% fclose(fileID);
% But if the file was really closed before, open it
% *before* the loop as shown in my code example above:
fileID = fopen(sprintf('lights_%s.txt', name_object) , 'a');
for k = 1:3
fprintf(fileID, '%f %f %f\n', direction_lights{k});
end
fclose(fileID);
Opening and closing the file inside the loop is not an error, but a waste of time. There might be situations, where this is useful, but not in this example.
Prefer full file names containing a path. Note that a GUI or timer callback might change the current folder unexpectedly. Then files will appear in unexpected locations are might be lost. Avoid such sources of confusions - too many others suffered from such mistakes already.
Read the thread about eval carefully. This will ease your life.
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Loops and Conditional Statements 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!