Создать файл, если он не существует - C - PullRequest
40 голосов
/ 23 марта 2012

Я хочу, чтобы моя программа открыла файл, если он существует, или создала файл.Я пытаюсь следующий код, но я получаю утверждение отладки в freopen.c.Будет ли лучше использовать fclose, а затем сразу же открывать fopen?

FILE *fptr;
    fptr = fopen("scores.dat", "rb+");
    if(fptr == NULL) //if file does not exist, create it
    {
        freopen("scores.dat", "wb", fptr);
    } 

Ответы [ 2 ]

52 голосов
/ 23 марта 2012

Обычно вы должны сделать это в одном системном вызове, иначе вы получите условие гонки.

Это откроет для чтения и записи, создавая файл при необходимости.

FILE *fp = fopen("scores.dat", "ab+");

Если вы хотите прочитать его, а затем написать новую версию с нуля, сделайте это в два этапа.

FILE *fp = fopen("scores.dat", "rb");
if (fp) {
    read_scores(fp);
}

// Later...

// truncates the file
FILE *fp = fopen("scores.dat", "wb");
if (!fp)
    error();
write_scores(fp);
9 голосов
/ 23 марта 2012

Если fptr равно NULL, то у вас нет открытого файла.Следовательно, вы не можете freopen это, вам нужно просто fopen это.

FILE *fptr;
fptr = fopen("scores.dat", "rb+");
if(fptr == NULL) //if file does not exist, create it
{
    fptr = fopen("scores.dat", "wb");
}

примечание : поскольку поведение вашей программы зависит от того, открыт ли файлв режимах чтения или записи вам, скорее всего, также необходимо сохранить переменную, указывающую, что именно так.

Полный пример

int main()
{
    FILE *fptr;
    char there_was_error = 0;
    char opened_in_read  = 1;
    fptr = fopen("scores.dat", "rb+");
    if(fptr == NULL) //if file does not exist, create it
    {
        opened_in_read = 0;
        fptr = fopen("scores.dat", "wb");
        if (fptr == NULL)
            there_was_error = 1;
    }
    if (there_was_error)
    {
        printf("Disc full or no permission\n");
        return EXIT_FAILURE;
    }
    if (opened_in_read)
        printf("The file is opened in read mode."
               " Let's read some cached data\n");
    else
        printf("The file is opened in write mode."
               " Let's do some processing and cache the results\n");
    return EXIT_SUCCESS;
}
...