1

次のようなものをファイルに書き込もうとしています。

keys = {'one','two','three'}
values = [1 2 3]

これはこれまでの私のコードです:

function save_recording_results(keys,values)
    keys=keys.';
    fid = fopen('hoping', 'wt');
    fprintf(fid, '%s : %f\n', keys{:},values);
    fclose(fid);
end

私の出力はこれです:

one : 116.000000 
wo : 116.000000
hree : 1.000000
:

私はそれをこのように見せたい:

one : 1
two : 2
three : 3

何が間違っているのかわかりません。なぜ最初の文字を落とすのですか?これは、最初の文字が「t」でない場合でも発生します。コロンの後のn番目の変数の行に(n + 1)番目の変数の最初の文字を出力していることがわかります。(TはASCIIで116です。)しかし、なぜですか?

4

2 に答える 2

1

何が起こっているのかというと、あなたが持っているとき、あなたはkeys{:}cs-listを返しているということです。基本的にあなたがしていることはこれです

printf ('%s : %f\n', 'one', 'two', 'three', [1 2 3]);

キー{:}の入力を試して、cs-list(カンマ区切りリスト)の意味を理解してください。

したがって、フォーマットを解釈するとき、最初に文字列(%s)を予期し、「1つ」を検出するため正常に機能します。2回目は、浮動小数点(%f)を期待しますが、文字列( "two")を取得します。したがって、それをベクトルに変換します。double ("two")これは[116 119 111]、最初のベクトルをフローティングに使用します。次に、別の文字列(2行目)が必要です。「t」は以前に取得された(フローティングに変換された)ため、文字列に使用される「wo」のみが含まれます。など、最後まで続きます。

正しく行う方法は次のとおりです。2列の新しいセル配列を作成する必要があります。以下は問題なく動作するはずです。

values = num2cell (values);
new    = {keys{:}; values{:}}
printf ('%s : %f\n', new{:})
于 2012-08-26T00:03:52.127 に答える
1

ループの使用に反対していない場合:

fid = fopen('hoping', 'wt');    
for a = 1:length(keys)
  fprintf (fid,'%s : %d\n', keys{a},values(a))
end
fclose(fid)
于 2012-08-26T00:59:10.967 に答える