2017-09-26 10 views
2

セル配列の内容でテキストファイルを作成しようとしています。以下はMWEです。ファイルの引数なしでfprintfを使用すると(コマンドウィンドウでのみ印刷する場合、たとえばfprintf(['\t\\hline ',repmat('%s & ',1,size(A,1)),'\b\b','\\\\','\n'],A{:}))、コードは正常に動作します。しかし、fopenでファイルを開き、同じものを書き込もうとすると、二重バックスペース(\b\b)は機能しません。fprintfからtxtファイル(MATLAB)で動作しないバックスペースを生成するための ' 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

+0

'A 'の内容が浮動小数点数の場合は、'%s'の代わりに '%f'を使用してください。 – rahnema1

+0

@ rahnema1これで問題は解決しません。 – Rodrigues

+0

[関連](https://stackoverflow.com/questions/43299376/writing-a-backspace-in-a-file/43299424).ItはバックスペースのASCIIコードをファイルに書き込みます。 – rahnema1

答えて

1

私はそれが正常に動作し、ファイルへの書き込み方法はないと思います。 fprintfは、受信した各文字をバックトラックやデータの解釈をせずにファイルに順番に書き込みます。 '\b'の生のバイト値(char(8))は、すべてのファイル(例えば、画像/バイナリデータ)のバックスペースを表すものではありません。あなたが言うように、ファイルを実際のテキストエディタ(NotepadやTextEditではなく)で開くと、実際に疑問符や開いたボックスや "BS"で表されるようなバックスペースが含まれていることがわかります。端末は、Matlabコマンドウィンドウのように、一般的に、テキストを表示する前に事前処理を行います。 This pageは少し背景を提供します。

私はMatlabのfprintfのこの動作を変更する方法に気づいていません。バックスペースを適用して書き直すには、ファイルに印刷する前にテキストを前処理したり、ファイルを後処理したりする必要があります。私の心に

は、これをより読みやすいソリューションです:あなたが使用している場合

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

:あなたは本当にバックスペースを維持したい場合にも、このような何かを行うことができ

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

あなたの質問のコードであり、OS XまたはLinux上でunixコマンドを使用して(hereから)、バックスペースが適用された新しいファイルを書き込むことができます:

unix('cat test.txt | col -b > test2.txt') 
関連する問題