2010-07-16 4 views
1

Я использую fopen для записи в двоичный файл и используя библиотеку cstdio (stdio.h) из-за устаревшего кода, и он должен быть кросс-платформенным, совместимым с Windows и Linux.Перезаписать файл, используя режим append для fopen

Для прототипа FILE * fopen (const char * filename, const char * mode);, я использую const char * mode = "ab", который будет добавляться к двоичному файлу. Операции записи добавляют данные в конце файла. Файл создается, если он не существует.

У меня есть N количество входных файлов, в которых я обрабатываю данные и записываю их в один выходной файл для каждого типа, где у меня есть M типов. Я обрабатываю один входной файл и записываю данные в каждый соответствующий выходной файл. Затем я закрою этот входной файл и откройте (i + 1) th и повторю процесс, добавив данные из входного файла в выходные файлы.

Если выходной файл существует в начале исполняемого файла, я хочу его удалить. Если он существует, и я его не удаляю, тогда, когда я использую режим "wb", он просто добавит данные в выходной файл, что приведет к дублированию, которое я не хочу. Я открыт для решения повышающего и мне нравится поддерживать стандарты как можно лучше (т.е. избежать POSIX, если это возможно)

fopen C++ reference

+2

держись, вы или не вы хотите его переписать? вы хотите, чтобы он добавил, что там? пожалуйста, уточните, что вы хотели бы сделать в случаях «уже существует» и «еще не существует» ... – eruciform

+2

Попробуйте уточнить свою цель более четко, я не могу сказать с вашего поста и кода, если вы хотите перезаписать (удалить) существующие файлы или избежать этого. Кроме того, ваш код не имеет большого смысла, потому что открытие существующего файла в режиме записи приведет к его удалению. – schnaader

ответ

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); 
    } 
} 

Режим "ш" следует перезаписать файл. Это режим «a», который позволит избежать удаления уже существующего файла.

EDIT: вы также можете удалить remove (const char * filename), если хотите удалить файлы в начале выполнения. Если это так, вам никогда не придется использовать режим «wb».

1

Если вы хотите переписать, а не добавлять, то почему бы просто не использовать режим «ББ «? «w» перезаписывает файл при записи.

+3

Возможно, он хочет уничтожить исходные данные, но затем будет в режиме добавления, так что даже если код fseek, любые записи будут по-прежнему заканчиваться. –

+0

@ Клавчко ... Хит гвоздь на голове – Elpezmuerto

2

Одним из возможных вариантов было бы использовать open (_open для Windows), чтобы создать соответствующий дескриптор файла, а затем использовать fdopen (_fdopen для 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");