0

我有一个单元格数组,例如:

>>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

这就是为什么我不能使用 text{:}。

4

1 回答 1

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
于 2013-07-15T10:01:16.847 回答