Перезаписать файл, используя режим добавления для fopen - PullRequest
1 голос
/ 16 июля 2010

Я использую 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 ++ ссылка

Ответы [ 3 ]

3 голосов
/ 16 июля 2010

Вот один из способов

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" должен перезаписывать файл.Это режим «а», который позволит избежать удаления уже существующего файла.

РЕДАКТИРОВАТЬ: Вы также можете remove (const char * filename), если вы хотите удалить файлы в начале выполнения.Если это так, то вам никогда не придется использовать режим "wb".

3 голосов
/ 16 июля 2010

Можно использовать 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");
1 голос
/ 16 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...