2017-09-26 4 views
2

Je suis en train de créer un fichier texte avec le contenu d'un tableau de cellules. Voici un MWE. Lorsque j'utilise fprintf sans l'argument de fichier (pour imprimer simplement dans la fenêtre de commande, par exemple, fprintf(['\t\\hline ',repmat('%s & ',1,size(A,1)),'\b\b','\\\\','\n'],A{:})), le code fonctionne très bien. Toutefois, lorsque j'ouvre un fichier avec fopen et que j'essaie d'écrire la même chose, le double retour arrière (\b\b) ne fonctionne pas.' b' pour produire le retour arrière ne fonctionne pas dans fprintf en fichier 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{:}) 

Ce que je reçois dans la fenêtre de commande:

\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 \\ 

Ce que je reçois dans le fichier '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 & \\ 

Et lors du collage le contenu de 'test.txt' à cette question, plutôt que de s'afficher exactement comme ils apparaissent dans le fichier .txt, certaines cases sont apparues là où le dos les allures auraient dû être appliquées (figure ci-dessous). Comment puis-je faire fonctionner les backspaces et supprimer & dans le fichier .txt?

text

+0

Si le contenu de 'A' est un nombre à virgule flottante, vous devez utiliser'% f' au lieu de '% s' – rahnema1

+0

@ rahnema1 Cela ne résout pas le problème. – Rodrigues

+0

[connexes] (https://stackoverflow.com/questions/43299376/writing-a-backspace-in-a-file/43299424). Il écrit le code ASCII de retour arrière dans le fichier. – rahnema1

Répondre

1

Je ne pense pas que ce soit comment écrire dans un fichier fonctionne normalement. fprintf écrit chaque caractère qu'il reçoit en séquence dans un fichier sans retour arrière ou interprétation des données. La valeur d'octet brute de '\b' (char(8)) ne représente pas un retour arrière dans tous les fichiers (par exemple, dans des données image/binaires). Comme vous le dites, si vous ouvrez le fichier dans un véritable éditeur de texte (par exemple, pas Notepad ou TextEdit), vous verrez qu'il inclut en effet les backspaces, probablement représentés comme des points d'interrogation ou des boîtes ouvertes ou "BS". Les terminaux, comme la fenêtre de commande Matlab, traitent généralement le texte avant de l'afficher. This page fournit un peu d'arrière-plan.

Je ne suis pas au courant d'un moyen de changer ce comportement de fprintf dans Matlab. Vous devez soit prétraiter le texte avant de l'imprimer dans un fichier, soit post-traiter le fichier pour appliquer les espaces de retour et réécrire.

A mon avis, une solution plus facile à lire à c'est:

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

Vous pouvez également faire quelque chose comme ça si vous voulez vraiment garder les backspaces:

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

Si vous utilisez le code dans votre question et vous êtes sur un OS X ou Linux, vous pouvez utiliser la commande unix pour faire quelque chose comme ça (à partir de here) écrire un nouveau fichier avec les backpaces appliqués:

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