【问题标题】:Create a file if one doesn't exist - C如果文件不存在则创建一个文件 - C
【发布时间】:2012-04-08 02:20:16
【问题描述】:

我希望我的程序打开一个文件(如果存在),或者创建该文件。我正在尝试以下代码,但我在 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);
    } 

【问题讨论】:

  • @tbert - 我担心人们不赞成解释失败的答案。感谢上帝,今天是星期五 :-)

标签: c fopen fclose freopen


【解决方案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);

【讨论】:

  • 如果 OP 已经存在,它似乎正试图以只读模式打开它(不过,我不明白他们为什么要在这种情况下创建它)。跨度>
  • 好吧,如果他不想给它写信,他就不需要。据我所知,如果不创建不必要的竞争条件,就无法以只读方式打开它。
  • @JamesMcLaughlin 我以为 rb+ 也会让我写?在这段代码之后,我需要从文件中读取所有内容,然后从头开始编写文件。
【解决方案2】:

如果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");
}

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

一个完整的例子

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

【讨论】:

  • 这有一个竞争条件,如果另一个进程在两次调用fopen之间创建文件,它将失败。
  • @DietrichEpp 没想到!
  • 如果初始点“如果fptrNULL,那么你没有打开的文件。因此,你不能reopen它。”解释了 OP 看到的行为(我相信它确实如此),然后,为了清楚起见,可能值得编辑文本以将该点与后续修复它的方法区分开来。 (也重新打开应该是 freopen)
  • @Shahbaz - 不客气。我认为另一个答案未能确定它将永远起作用的关键点。因此,人们可能会阅读该答案,并且他们的收获可能是关于比赛条件的,尤其是在它已被投票赞成的情况下,而实际上它要简单得多。我可以想象花费数小时试图确定比赛条件(不存在:-)
猜你喜欢
  • 2016-06-18
  • 2013-12-25
  • 2011-01-19
  • 2014-01-02
  • 2012-05-10
  • 2013-09-18
  • 1970-01-01
相关资源
最近更新 更多