1

fopenレガシーコードのためにバイナリファイルへの書き込みとライブラリの使用を使用していますがcstdio (stdio.h)、WindowsおよびLinuxとクロスプラットフォームで互換性がある必要があります。

プロトタイプにはFILE * fopen ( const char * filename, const char * mode );、を使用const char * mode = "ab"しています。これは、バイナリファイルに追加されます。書き込み操作は、ファイルの最後にデータを追加します。ファイルが存在しない場合は作成されます。

N個の入力ファイルがあり、データを処理し、タイプごとに1つの出力ファイルに書き込みます。ここで、M個​​のタイプがあります。1つの入力ファイルを処理し、対応する各出力ファイルにデータを書き込みます。次に、そのi番目の入力ファイルを閉じて(i + 1)番目を開き、入力ファイルのデータを出力ファイルに追加してプロセスを繰り返します。

実行可能ファイルの先頭に出力ファイルが存在する場合は、削除してください。存在し、削除しない場合、"wb"モードを使用すると、出力ファイルにデータが追加されるだけで、不要な重複が発生します。私はブーストソリューションを受け入れており、可能な限り標準を維持したいと思っています(つまり、可能であればPOSIXを避けます)

fopenC++リファレンス

4

3 に答える 3

4

これが1つの方法です

char* infile[N] = //input names
char* outfile[M] = //output names

int i, j;
for (i = 0; i < N; i++){
  //process input
  char* mode = "ab";
  if (i == 0) mode = "wb";
  for (j = 0; j < M; j++){
    FILE* f = fopen(outfile[j], mode);
    //write to file
    fclose(f);
  }
}

「w」モードはファイルを上書きする必要があります。これは、既存のファイルの削除を回避する「a」モードです。

編集:remove (const char * filename)実行の開始時にファイルを削除したい場合にもできます。その場合は、「wb」モードを使用する必要はありません。

于 2010-07-16T19:44:19.770 に答える
4

1つの可能性は、open_openWindowsの場合)を使用して適切なファイルハンドルを作成し、次にfdopen_fdopenWindowsの場合)を使用してそれからstdioハンドルを作成することです。LinuxとWindowsで名前が完全に同じではないという事実を処理するには、プリプロセッサの魔法が必要になります。

// Allow us to use Posix compatible names on Windows
#ifdef WINDOWS
#define open      _open
#define O_CREAT   _O_CREAT
#define O_TRUNC   _O_TRUNC
#define O_APEND   _O_APPEND
#define S_IREAD   _S_IREAD
#define S_IWRITE  _S_IWRITE
#define fdopen    _fdopen
#endif

int fd = open(filename, O_CREAT | O_TRUNC | O_APPEND, S_IREAD | S_IWRITE);
FILE *fp = fdopen(fd, "a");
于 2010-07-16T19:45:31.297 に答える
1

追加するのではなく上書きしたい場合は、モード「wb」を使用してみませんか?「w」は書き込み時にファイルを上書きします。

于 2010-07-16T18:31:58.323 に答える