使用fopen的append模式覆盖文件

时间:2010-07-16 18:30:18

标签: c file fopen overwrite

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

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

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

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

fopen C++ reference

3 个答案:

答案 0 :(得分:3)

这是一种方式

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”模式。

答案 1 :(得分:3)

一种可能性是使用open(Windows _open)创建适当的文件句柄,然后使用fdopen(Windows _fdopen)创建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");

答案 2 :(得分:1)

如果你想覆盖而不是追加,为什么不使用模式“wb”? “w”在写作时会覆盖文件。