Создайте файл, если он не существует - C
Я хочу, чтобы моя программа открывала файл, если он существует, или же создайте файл. Я пытаюсь выполнить следующий код, но я получаю утверждение отладки на 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);
}
Ответы
Ответ 1
Обычно вам нужно сделать это в одном системном вызове, иначе вы получите условие гонки.
Это откроется для чтения и записи, создав файл, если необходимо.
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);
Ответ 2
Если 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");
}
note. Поскольку поведение вашей программы зависит от того, открыт ли файл в режимах чтения или записи, вам, скорее всего, также необходимо сохранить переменную, указывающую, в чем дело.
Полный пример
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 read some cached data\n");
else
printf("The file is opened in write mode."
" Let do some processing and cache the results\n");
return EXIT_SUCCESS;
}