2

私は次のようなコードを書こうとしました:

  %# Matlab reads a notepad file.

  f_id=fopen('n1.txt','r');
  reports=textscan(f_id, '%s', 'Delimiter', '\n')
  fclose(f_id)
  reports_saved=reports{1} ;
  P='blah blah'

編集:

 goes to a specific line of the text file.
X=ftell(f_id)
Ai=fseek(f_id, 0, 'cof')
 fprintf(f_id,'%s', P);
 fclose(f_id)

'cof'ポインタが上書きされた1行目。ここで、問題1:新しいテキストが既存のテキストよりも短い場合、既存のテキストの文字は上書き後も残ります。理由のヒントはありますか?問題2:「fseek」では、ファイルの先頭、現在の位置、または末尾にしか移動できません。テキストno4/5に行くように、ポインタをランダムに動かす方法はありますか?各テキストの間に空白行があることに注意してください。

どんな助けでも大歓迎です。

4

2 に答える 2

3

テキストファイルは、ディスク上の連続したバイトのセットです。ファイルの途中でテキストのセグメントの長さを変更した場合は、ファイルの後続のすべてのバイトを書き換えてから、ファイルを切り捨てるか拡張する必要があります。自動的にシフトしません。これは、リンクリストではなく、メモリ内の配列構造を挿入または削除するようなものです(Cのような低レベル言語ではMatlabのように配列のサイズを自動的に変更しません)。

ファイルを直接操作することは、おそらくこれを行うための間違った方法です。Matlabは、テキストを短いテキストに置き換えた後にファイルを短縮するために必要なftruncate()関数も提供していません。ファイル全体をメモリ内の配列に読み込み、そこで操作してから、元のファイルを置き換えて、fopen(...、'w')を使用してファイル全体を書き戻します。行指向の変更を行う場合は、行区切り文字が埋め込まれた1つの大きなchar配列ではなく、行のcellstr配列を使用する方がおそらく簡単です。

于 2011-02-28T20:07:28.810 に答える
2

でファイルを開いてみてください'r+''w'新しいファイルを作成し、古いファイル(存在する場合)のすべてを削除します。

f_id=fopen('fire.txt','r+');

于 2011-02-28T01:17:16.413 に答える