web-dev-qa-db-ja.com

ファイルが存在しない場合は作成します-C

プログラムにファイルが存在する場合はそれを開くか、ファイルを作成します。次のコードを試していますが、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);
    } 
41
karoma

通常、これを単一のシステムコールで行う必要があります。そうしないと、競合状態になります。

これは読み取りと書き込みのために開き、必要に応じてファイルを作成します。

FILE *fp = fopen("scores.dat", "ab+");

それを読んで、新しいバージョンを最初から書きたい場合は、2つのステップとして行います。

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);
53
Dietrich Epp

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