我有一个像:
这样的单元格数组>>text
'Sentence1'
'Sentence2'
'Sentence3'
每当我使用
sprintf(fid,'%s\n',text)
我收到错误说:
'Function is not defined for 'cell' inputs.'
但如果我说:
sprintf(fid,'%s\n',char(text))
它有效,但在文件中出现的所有句子都混合在一起,就像没有任何意义一样。
你能推荐我做什么吗?
我把文字拿到了:
>>text
'Title '
'Author'
'comments '
{3x1} cell
这就是为什么我不能使用文字{:}。
答案 0 :(得分:0)
如果您发出
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