2017-04-14 8 views
-2

でfprintfの私は、ファイルを検索し、いくつかのテキストこのループで何が問題になっていますか? MathWorks社のMATLAB

fid = fopen('wave_propagation_var5_alpha1delta1.CPS_001', 'rt+') 
fprintf(fid, 'dsadsado') 
for i =1:383 

      currentline = fgetl(fid) 
      currentline = strtrim(currentline) 
      if strcmp(currentline, '$$SOLID_ANORMAL')==1 
       fprintf(fid, 'hello') 
      elseif strcmp(currentline, '$$SOLID_DELTANORMAL')==1 
       fprintf(fid, num2str(deltalist(i))) 
      else 
      end 
    i=i+1 
end 

2行を追加することになっているループを持っているが、正しくファイルに印刷するように表示されます。しかし、私はなぜ7行目と9行目ではないのか分かりません。私がifステートメントをデバッグすると、コードは両方の行に入り、それらを実行します。私がターゲットファイルを開くとき、なぜ何も起こっていないのは分かりません。

+0

同時に同じファイルから読み書きしようとしています...あなたが読んでいるファイルとは別のファイルに書き込んでいます。 – Suever

答えて

0

@Sueverで示されるように、同じファイルから同時に読み書きすることはできません。読み取りと書き込みの間には、frewindまたはfseekのいずれかが必要です。これは私が以下に選んだ解決策です。

代わりSueverの答え@提案府として記述するための新しいファイルを開くと、それは次のようん:

1)既存のファイル

2を読み込み)ftell

を使用してへの書き込み位置を記憶

3)ファイル

4を巻き戻し)はfseekfprintfを使用して覚えて位置への書き込み:

それは 書き込みを読み取るため rt+許可をフル活用していますので、
fid = fopen('wave_propagation_var5_alpha1delta1.CPS_001', 'rt+') 
    while ~feof(fid) 
     currentline = fgetl(fid) 
     currentline = strtrim(currentline) 
     if strcmp(currentline, '$$SOLID_ANORMAL')==1 
      alphaline = ftell(fid) 
     elseif strcmp(currentline, '$$SOLID_DELTANORMAL')==1 
      deltaline = ftell(fid) 
     else 
     end 
    end 

    frewind(fid) 
    fseek(fid,alphaline,0) 
    fprintf(fid, 'hello') 
    frewind(fid) 
    fseek(fid,deltaline,0) 
    fprintf(fid,num2str(deltalist(i))) 

Sueverの答えは完全に有効かつ許容可能である@ながら、私はこの方法を好みます。書き込みを行うために別のファイルを作成する必要性を回避し、既存のファイルを使用して必要な変更を加えます。

2

MATLABの同じファイルから積極的に読み書きすることをお勧めします。代わりに、出力用に別のファイルを使用したいと思うでしょう。

fin = fopen('wave_propagation_var5_alpha1delta1.CPS_001', 'rt+'); 
fout = fopen('wave_propagation_var5_alpha1delta1.CPS_001.out', 'w'); 

for i =1:383 
    currentline = fgetl(fin) 
    currentline = strtrim(currentline) 
    if strcmp(currentline, '$$SOLID_ANORMAL')==1 
     fprintf(fout, 'hello') 
    elseif strcmp(currentline, '$$SOLID_DELTANORMAL')==1 
     fprintf(fout, num2str(deltalist(i))) 
    end 

    % Print a newline every time to get correspondence 
    fprintf(fout, '\n') 
    i=i+1 
end 

fclose(fin) 
fclose(fout) 

% Replace the input file with the output file if you want 
movefile('wave_propagation_var5_alpha1delta1.CPS_001.out', ... 
     'wave_propagation_var5_alpha1delta1.CPS_001'); 
+0

はい、これは出力ファイルの入力ファイルとは異なる位置に印刷されますが、正しいですか? '$$ SOLID_ANORMAL'が発生する行が200行目のようにそこにあると言うことができます。if文で検出され、iがfoutに出力されると、現在の位置とは異なるfoutの現在の位置に出力されますフィン。 – user32882

+0

その場合、Matlabのドキュメントで、読み込みと書き込み(r +)を伴うfopenのオプションが提供されるのはなぜですか?なぜそれをパーミッションの1つとして含めるのかという悪い考えがある場合https://nl.mathworks.com/help/matlab/ref/fopen.html#inputarg_permission – user32882

+0

@ user32882毎回改行を印刷してください。更新を参照してください。 – Suever

関連する問題