Как открыть файл таким образом, чтобы, если файл не существует, он был создан и открыт автоматически?

Вот как я открываю файл для записи+:

if( fopen_s( &f, fileName, "w+" ) !=0 ) {
    printf("Open file failed\n");
    return;
}
fprintf_s(f, "content");

Если файл не существует, операция открытия завершится неудачно. Каков правильный способ fopen, если я хочу создать файл автоматически, если файл еще не существует?

EDIT: если файл существует, я бы хотел, чтобы fprintf перезаписывал файл, а не добавлял к нему.


person snakile    schedule 27.12.2010    source источник
comment
Режим w+ уже является правильным режимом: он приводит к открытию пустого файла как для чтения, так и для записи, независимо от того, существует ли файл уже. Вы хотите посмотреть на ненулевое возвращаемое значение из fopen_s(), чтобы понять, почему вызов не удался. Если вам не нужен произвольный доступ (а вы, вероятно, не нуждаетесь), используйте только w для режима.   -  person RBerteig    schedule 27.12.2010
comment
@RBerteig: Спасибо. Не могли бы вы ответить с образцом кода, в котором вы показываете мне, как использовать возвращаемое значение fopen_s() для создания нового файла, если файл еще не существует?   -  person snakile    schedule 27.12.2010


Ответы (2)


Чтобы перезаписать любой существующий файл, используйте вызов creat:

#include <fcntl.h>
#include <stdio.h>

int fd = creat (fileName, 0666);  // creates file if not exist, overwrite existing
FILE *f = fdopen (fd, "w");  // optional, if FILE * type desired
person wallyk    schedule 27.12.2010

Вы пытались просто сделать fopen(name, "w")? Кроме того, вам, возможно, следует расширить свой код, чтобы сообщить, какая ошибка сообщается, используя, например. perror().

Примечание

Между прочим, я бы избегал (по крайней мере, большинства) функций _s MSVC, несмотря на предупреждения. Во-первых, в этом очень мало смысла, за исключением случаев, когда:

  1. Исходная функция либо пишет в переданный буфер, но не имеет параметра для указания размера буфера (например, strcat()), либо

  2. Исходной функции разрешалось/требовалось возвращать указатель на статический буфер (например, strerror()), что делает

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

person SamB    schedule 27.12.2010