由于遗留代码,我使用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)
答案 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”在写作时会覆盖文件。