如果文件不存在,则创建一个文件 - C.

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)


Sha*_*baz 9

如果fptrNULL,那么您没有打开的文件.因此,你不能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)

  • 这有一个竞争条件,如果另一个进程在两次调用`fopen`之间创建文件,它将失败. (2认同)
  • 如果初始点"如果`fptr`是'NULL`,那么你没有打开文件.因此,你不能'重新打开'它." 解释了OP所看到的行为(我认为它确实如此),然后,为了清楚起见,可能值得编辑文本,以便从后续的修复方法中分离出这一点.(也重新打开应该是freopen) (2认同)
  • @Shahbaz - 不客气.我认为另一个答案未能确定它将无法工作的关键点.因此人们可能会读到这个答案,他们的收获可能与竞争条件有关,特别是当它被提升时,它实际上要简单得多.我可以想象花费数小时试图确定竞争条件(不存在:-) (2认同)