如果你发出
sprintf('%s\n', text)
你是说“用换行符打印一个字符串。字符串就是这个单元格数组”。这是不正确的;单元格数组不是字符串。
如果你发出
sprintf('%s\n', char(text))
你说的是“用换行符打印一个字符串。字符串是这个单元格数组,我将它转换为字符数组。”。问题是,转换会产生单个字符数组,并且只会将格式sprintf
重新用于多个输入。此外,它按列写入单个字符数组,意思是第一列中的所有字符,与第二列中的所有字符水平连接,与第三列中的所有字符连接,等等。%s\n
因此,适当的调用sprintf
是具有多个输入的:
sprintf(fid, '%s\n', text{:})
因为单元格扩展text{:}
从单元格数组中的所有条目创建一个逗号分隔的列表,这正是sprintf
/所fprintf
期望的。
编辑 正如您所指出的:您在text
. 你必须检查一下。如果您只想将字符串传递给fprintf
,请使用
fprintf(fid, '%s\n', text{ cellfun('isclass', text, 'char') })
如果那又{3x1 cell}
是一组字符串,所以您想递归地编写所有字符串,那么只需使用以下内容:
function textWriter
text = {...
'Title'
'Author'
'comments'
{...
'Title2'
'Author2'
'comments2'
{...
'Title3'
'Author3'
'comments3'
}
}
}
text = cell2str(text);
fprintf(fid, '%s\n', text{:});
end
function out = cell2str(c)
out = {};
for ii = c(:)'
if iscell(ii{1})
S = cell2str(ii{1});
out(end+1:end+numel(S)) = S;
else
out{end+1} = ii{1};
end
end
end