MATLAB: Using fprintf to write to multiple files simultaneously

fprintfMATLAB

I want to write the same text to the screen and in to a file. So I have to double the code:
fprintf('this is some text with numbers: %d, %d', x,y);
fprintf(fid, 'this is some text with numbers: %d, %d', x,y);
Alternatively I can introduce a text string to avoid double code:
str = sprintf('this is some text with numbers: %d, %d', x,y);
fprintf(str);
fprintf(fid, str);
But obviously it does not work to use fprintf to write to mutliple files simultaneously? Would be nice if possible.
fprintf([1 fid],'this is some text with numbers: %d, %d', x,y);

Best Answer

As far as I know, this feature is not natively supported by MATLAB. But if it is really important for your application, then you can try the following two methods.
First, create a custom function which takes an array of FIDs and call fprintf one by one on each of them. Save the following function in a file printf.m in MATLAB's path.
function printf(fid, varargin)
for f = fid(:)'
fprintf(f, varargin{:});
end
end
Call this function
f = fopen('test.txt', 'w+');
printf([1 f 1 1 f], 'hello world\n');
fclose(f);
Second, overload the fprintf function. Create a folder name @double in your MATLAB's path and save the following function in file fprintf.m
function y = fprintf(fid, varargin)
y = zeros(size(fid));
for i = 1:numel(fid)
y(i) = builtin('fprintf', fid(i), varargin{:});
end
end
[Important note:] The definition of overloaded function is updated; the first code can break the compatibility in some cases.
Call this function
f = fopen('test.txt', 'w+');
fprintf([1 f 1 1 f], 'hello world\n');
fclose(f);
Note that this overloading will not break compatibility, other programs calling fprintf() will still work normally.
As a side note, these functions can also be written as one-liners without for-loop:
printf.m:
function printf(fid, varargin)
arrayfun(@(f) fprintf(f, varargin{:}), fid);
end
fprintf.m
function y = fprintf(fid, varargin)
y = cell2mat( arrayfun(@(f) {builtin('fprintf', f, varargin{:})}, fid) );
end