2016-03-02 350 views
1

我有一个抽象类Writer,它允许客户写入。可能是屏幕,可能是一个文件。现在,我尝试创建派生类来写入字符串在Matlab中正确写入字符串(高效并保留转义字符)

我有两个问题与表示为线方法write(...)

  1. 这也可能是非常低效的。有没有像Matlab中的字符串缓冲区?
  2. 它将转义序列(如\n)写入字符串中,而不是采用其实际含义。

我该如何正确地得到表示线?

代码:

classdef StringTextWriter < Writer 

properties 
    str; 
end 

methods 

    function this = StringTextWriter() 
     % Init the write-target which is a string in our case. 
     % (Other Writer classes would maybe open a file.) 
     this.str = ''; 
    end 

    function write(this, val) 
     % Write to writer target. 
     % (Other Writer classes would maybe use fprinf here for file write.) 

     % ????????????????????????????? 
     this.str = [this.str val]; % How to do this properly? 
     % ????????????????????????????? 
    end 

end 

end 

回答

2

回答您的问题逐点:

  1. 最接近的概念来一个字符串缓冲区将是一个串电池。相反的:

    str = ''; 
    str = [strbuf, 'abc\n']; 
    str = [strbuf, 'def\n']; 
    str = [strbuf, 'ghi\n']; 
    %// and so on... 
    

    一个可以使用

    strbuf = {}; 
    strbuf{end+1} = 'abc\n'; 
    strbuf{end+1} = 'def\n'; 
    strbuf{end+1} = 'ghi\n'; 
    %// and so on... 
    str = sprintf([strbuf{:}]); %// careful about percent signs and single quotes in string 
    

    缺点是,你必须在你每次请求它的时间来重建的字符串。这可以通过在每次将字符串添加到strbuf的末尾时设置一个modified标志来缓解,每次连接字符串时重置该字符串,并在最后一行中记忆连接的结果(如果是modified,则重建)或者如果不是, 。

    通过选择更好的策略来生长strbuf单元阵列可以实现进一步的改进;如果您有方法调用write大概这将是有效的。

  2. 转义序列确实与<?>printf系列链接,而不是字符串文字,因此MATLAB通常不关心它们,但sprintf尤其可能。

相关问题