创build一个文件,如果一个不存在 – C

我希望我的程序打开一个文件,如果它存在,或者创build文件。 我想下面的代码,但我得到一个debugging断言freopen.c。 我会使用fclose更好,然后立即打开吗?

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

您通常必须在单个系统调用中执行此操作,否则您将获得竞争条件。

这将打开阅读和写作,如有必要创build文件。

 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); 

如果fptrNULL ,那么你没有打开的文件。 因此,你不能fopen它,你应该fopen它。

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

注意 :由于程序的行为取决于文件是以读取模式还是写入模式打开,您可能还需要保留一个variables,指出是哪种情况。

一个完整的例子

 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; }