kar*_*oma 41 c fopen fclose freopen
我希望我的程序打开一个文件,如果它存在,或者创建该文件.我正在尝试以下代码,但我在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);
}
Run Code Online (Sandbox Code Playgroud)
Die*_*Epp 54
您通常必须在一个系统调用中执行此操作,否则您将遇到竞争条件.
这将打开进行读写,必要时创建文件.
FILE *fp = fopen("scores.dat", "ab+");
Run Code Online (Sandbox Code Playgroud)
如果您想阅读它然后从头开始编写新版本,那么请分两步完成.
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);
Run Code Online (Sandbox Code Playgroud)
如果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");
}
Run Code Online (Sandbox Code Playgroud)
注意:由于程序的行为取决于文件是以读取还是写入模式打开,因此您很可能还需要保留一个变量来指示是哪种情况.
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;
}
Run Code Online (Sandbox Code Playgroud)