1

由于遗留代码,我fopen用于写入二进制文件并使用该cstdio (stdio.h)库,并且它必须与 Windows 和 Linux 跨平台兼容。

对于原型,FILE * fopen ( const char * filename, const char * mode );我使用的是const char * mode = "ab",它将附加到二进制文件中。写入操作在文件末尾追加数据。如果文件不存在,则创建该文件。

我有 N 个输入文件,我在其中处理数据并为每种类型写入一个输出文件,其中我有 M 种类型。我处理一个输入文件并将数据写入每个相应的输出文件。然后,我将关闭第 i 个输入文件并打开 (i + 1) 个,并通过将输入文件中的数据附加到输出文件来重复该过程。

如果可执行文件的开头存在输出文件,我希望将其删除。如果它存在并且我不删除它,那么当我使用该"wb"模式时,它只会将数据附加到输出文件,这将导致我不想要的重复。我对提升解决方案持开放态度,并且我希望尽可能地保持标准(即尽可能避免使用 POSIX)

fopen C++ 参考

4

3 回答 3

4

这是一种方法

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

一种可能性是使用open( _openfor Windows) 创建适当的文件句柄,然后使用fdopen( _fdopenfor Windows) 创建一个 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 回答