'\b' для создания обратного пространства, не работающего в файле fprintf to txt (MATLAB)

Я пытаюсь создать текстовый файл с содержимым массива ячеек. Ниже представлен 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?

текст


person Rodrigues    schedule 26.09.2017    source источник
comment
Если содержимое A является числом с плавающей запятой, вы должны использовать %f вместо %s   -  person rahnema1    schedule 26.09.2017
comment
@ rahnema1 Это не решает проблему.   -  person Rodrigues    schedule 26.09.2017
comment
Связано. Он записывает ASCII-код возврата в файл.   -  person rahnema1    schedule 26.09.2017
comment
@ rahnema1, до сих пор нет решения.   -  person Rodrigues    schedule 26.09.2017


Ответы (1)


Я не думаю, что так обычно работает запись в файл. fprintf записывает каждый полученный символ в файл без возврата или интерпретации данных. Необработанное байтовое значение '\b' (char(8)) не представляет собой пробел во всех файлах (например, в изображениях/двоичных данных). Как вы говорите, если вы откроете файл в текстовом редакторе (например, не в Блокноте или TextEdit), вы увидите, что он действительно включает пробелы, которые, вероятно, представлены в виде вопросительных знаков, открытых полей или «BS». Терминалы, такие как командное окно Matlab, обычно предварительно обрабатывают текст перед его отображением. Эта страница содержит некоторую информацию.

Я не знаю, как изменить это поведение fprintf в Matlab. Вам нужно либо предварительно обработать текст перед его печатью в файл, либо выполнить постобработку файла, чтобы применить символы возврата и перезаписать.

На мой взгляд, более читаемое решение:

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, чтобы сделать что-то подобное (из здесь) напишите новый файл с применением пробелов:

unix('cat test.txt | col -b > test2.txt')
person horchler    schedule 27.09.2017