Create a file if one doesn't exist - C
You typically have to do this in a single syscall, or else you will get a race condition.
This will open for reading and writing, creating the file if necessary.
FILE *fp = fopen("scores.dat", "ab+");
If you want to read it and then write a new version from scratch, then do it as two steps.
FILE *fp = fopen("scores.dat", "rb");if (fp) { read_scores(fp);}// Later...// truncates the fileFILE *fp = fopen("scores.dat", "wb");if (!fp) error();write_scores(fp);
If fptr
is NULL
, then you don't have an open file. Therefore, you can't freopen
it, you should just fopen
it.
FILE *fptr;fptr = fopen("scores.dat", "rb+");if(fptr == NULL) //if file does not exist, create it{ fptr = fopen("scores.dat", "wb");}
note: Since the behavior of your program varies depending on whether the file is opened in read or write modes, you most probably also need to keep a variable indicating which is the case.
A complete example
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;}