想一想写入文件的过程:它会按顺序(通常)将字节从内存复制到存储介质。你要求的是做以下事情(我假设第一个fprintf在随后的调用中写aaa,bbb,ccc,第二个写AAA,BBB,CCC)。
aaaAAA - after first pass
aaabbbAAABBB - after second pass
aaabbbcccAAABBBCCC - after third pass
现在,如果你知道总的第一条语句的全部著作究竟有多长会,您可以:你想要的文件的内容将在本系列的下一行每次迭代之后
使用 “随机访问” 的文件
这可能是OK “有时” 做
aaa AAA
aaabbb AAABBB
aaabbbcccAAABBBCCC
。不过,我认为在内存中创建这些块会更有意义,并最终写出它们。
s1 = '';
s2 = '';
for ii=1:5
s1 = [s1 sprintf('format etc', data, data)];
s2 = [s2 sprintf('other format', otherData)];
end
最后你写他们依次是::
fprintf(fileID, '%s%s', s1, s2);
不是很理想,因为你的风险越来越多的字符串,可以是相当缓慢的(如果它让你可以用sprintf,而不是fprintf做到这一点对于分配的空间来说太大了,整个字符串必须移动;随着字符串变大,字符串逐渐变慢。如果知道字符串的大小,可以预先分配字符串,但这会增加很多复杂)。
真的 - 一系列for循环一次为一种类型的数据执行所有操作,这样输出按您想要的顺序生成,并不是一个糟糕的计划。
另一个解决方案 - 规避了一些内存分配问题:使用sprintf将值放入二维单元阵列中 - 当完成后,将单元阵列的转置打印到文件中。
storage = cell(3,2);
for ii=1:3
storage{ii,1}=sprintf('%d \n',ii);
storage{ii,2}=sprintf('%.2f\n', ii);
end
% now write the resulting strings in the order you want them:
for ii = 1:2
for jj = 1:3
fprintf(1, '%s', storage{jj,ii});
end
end
% but you don't even need these loops:
fprintf(1, 'and now all at once:...\n');
fprintf(1, '%s', [storage{:}])
这样做的输出就是你要找的人:
1
2
3
1.00
2.00
3.00
and now all at once:...
1
2
3
1.00
2.00
3.00
正如你可以看到,我们虽然写了备用%d和%.2f号到单元阵列,在最终输出它们的分组如你所想。并且通过像我为单元格数组一样选择索引的顺序,将整个事物打印成单行(而不是第二组嵌套循环)。