6

私のコードは現在次のようになっています(これらのステップは複数の関数に分割されています):

/* open file */
FILE *file = fopen(filename, "r+");

if(!file) {

  /* read the file */

  /* modify the data */

  /* truncate file (how does this work?)*/

  /* write new data into file */

  /* close file */
  fclose(file);
}

モードでファイルを開くことができることはわかっていますが"w"、この場合はこれを行いたくありません。/に関数ftruncateがあることは知っていますが、これらの関数を使用したくないので、コードは(Windowsでも)移植性が高いはずです。unistd.hsys/types.h

ファイルを閉じたり再度開いたりせずにファイルをクリアする可能性はありますか?

4

2 に答える 2

6

標準Cでは、切り捨てが必要になるたびにファイルを「w+」モードで再度開くのが唯一の方法です。これに使用できますfreopen()。「w+」は引き続き読み取りを許可するため、「r+」モードで閉じて再度開く必要はありません。「w+」のセマンティクスは次のとおりです。

読み取りと書き込みのために開きます。ファイルが存在しない場合は作成され、存在しない場合は切り捨てられます。ストリームはファイルの先頭に配置されます。

(fopen(3)のマニュアルページから取得。)

を使用する場合、filenameパラメーターとしてNULLポインターを渡すことができますfreopen()

my_file = freopen(NULL, "w+", my_file);

ファイルから読み取る必要がまったくなくなった場合は、「w」モードでも問題ありません。

于 2012-10-19T20:01:42.037 に答える
3

次のような関数を書くことができます:(擬似コード)

if(this is linux box) 
use truncate()
else if (this is windows box)
use _chsize_s()

これは、要件に対する最も簡単なソリューションです。

参照:msdn.microsoft.comのmantruncateおよび_chsize_s

必要なヘッダーファイルもインクルードします。

于 2012-10-19T19:48:10.223 に答える