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

问题描述:

我想用单元格数组的内容制作一个文本文件。以下是MWE。当我使用没有文件参数的fprintf(只在命令窗口中打印时,例如fprintf(['\t\\hline ',repmat('%s & ',1,size(A,1)),'\b\b','\\\\','\n'],A{:})),代码工作得很好。但是,当我用fopen打开一个文件并尝试向它写入相同的内容时,双后退(\b\b)不起作用。' b'产生退格不工作在fprintf到txt文件(MATLAB)

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文件中看到的那样显示,有些框显示了后面的位置步伐应该已经被应用(如下图)。我怎样才能让backspaces工作并删除.txt文件中的&

text

+0

如果'A'的内容是浮点数,则应该使用'%f'而不是'%s' – rahnema1

+0

@ rahnema1这并不能解决问题。 – Rodrigues

+0

[相关](https://*.com/questions/43299376/writing-a-backspace-in-a-file/43299424)。它将退格的ASCII码写入文件。 – rahnema1

我不认为这是如何写入文件正常工作。 fprintf将它接收的每个字符按顺序写入文件,而不回溯或解释数据。 '\b'char(8))的原始字节值不代表所有文件中的退格(例如,在图像/二进制数据中)。正如你所说,如果你用真正的文本编辑器打开文件(例如,不是记事本或文本编辑器),你会发现它确实包括了退格,可能表示为问号或打开框或“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)写一个新的文件与应用的backspaces:

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