' \ B'产生退格不能在fprintf中工作到txt文件(MATLAB)

时间:2017-09-26 17:23:49

标签: matlab printf file-writing backspace

我正在尝试使用单元格数组的内容创建一个文本文件。以下是MWE。当我使用没有文件参数的fprintf时(仅在命令窗口中打印,例如fprintf(['\t\\hline ',repmat('%s & ',1,size(A,1)),'\b\b','\\\\','\n'],A{:})),代码就可以正常工作。但是,当我使用fopen打开文件并尝试向其写入相同的内容时,双退格(\b\b)不起作用。

MWE:

A = num2cell(rand(3,3));
fid = fopen('test.txt','w');
fprintf(fid,['\t\\hline ',repmat('%s & ',1,size(A,1)),'\b\b','\\\\','\n'],A{:})

我在命令窗口中得到了什么:

\hline 7.922073e-01 & 9.594924e-01 & 6.557407e-01 \\
\hline 3.571168e-02 & 8.491293e-01 & 9.339932e-01 \\
\hline 6.787352e-01 & 7.577401e-01 & 7.431325e-01 \\

我在' test.txt'文件:

\hline 7.922073e-01 & 9.594924e-01 & 6.557407e-01 & \\
\hline 3.571168e-02 & 8.491293e-01 & 9.339932e-01 & \\
\hline 6.787352e-01 & 7.577401e-01 & 7.431325e-01 & \\

当粘贴' test.txt'的内容时对于这个问题,而不是完全按照他们在.txt文件中看到的那样,一些框出现了应该应用退格的地方(如下图所示)。如何让退格键工作并删除.txt文件中的&

text

1 个答案:

答案 0 :(得分:1)

我认为写入文件通常不起作用。 fprintf将按顺序接收的每个字符写入文件,而不回溯或解释数据。 '\b'char(8))的原始字节值不代表所有文件中的退格(例如,在图像/二进制数据中)。如你所说,如果你在真正的文本编辑器中打开文件(例如,不是记事本或TextEdit),你会发现它确实包含退格,可能表示为问号或打开的框或“BS”。终端,如Matlab命令窗口,通常在显示之前预处理文本。 This page提供了一些背景知识。

我不知道在Matlab中改变fprintf的这种行为的方法。您需要在文本打印到文件之前预处理文本,或者对文件进行后处理以应用退格并重写。

在我看来,更可读的解决方案是:

A = num2cell(rand(3,3));
fid = fopen('test.txt','w');
str = repmat('%f & ',1,size(A,1));
fprintf(fid,['\t\\hline ',str(1:end-2),'\\\\','\n'],A{:});
fclose(fid);

如果你真的想保留退格,你也可以这样做:

A = num2cell(rand(3,3));
fid = fopen('test.txt','w');
str = sprintf(['\t\\hline ',repmat('%f & ',1,size(A,1)),'\b\b','\\\\','\n'],A{:});
fprintf(fid,'%s',str);
fclose(fid);

如果您使用问题中的代码,并且您使用的是OS X或Linux,则可以使用unix命令执行此类操作(来自here),并使用退格应用:

unix('cat test.txt | col -b > test2.txt')