3

このコードの出力を理解できませんでしたか?

int main()
{
    FILE* f, *f1;
    f = fopen("mytext", "w");
    if ((f1 = fopen("mytext", "w")) == 0)
       printf("unable\n");
    fprintf(f, "hello\n");
    fprintf(f1, "hi\n");
    return 0;
}

mytextファイルの出力はhelloです。なぜ書かれていないのですか?「unable」はstdoutに出力されません。

4

2 に答える 2

12

同じファイルに対して2つのFILE*を開いており、ファイルの先頭を指しているため、一方の書き込みがもう一方の書き込みを上書きします。

また、FILE *は通常バッファリングされるため、FILE *をfclose()またはfflush()すると、これらの小さな文字列が実際にファイルに書き込まれることにも注意してください。どちらも行わないため、システムはアプリケーションの終了時にそれを行います。したがって、どの書き込みが上書きされるかは、システムが最初に閉じるファイルによって異なります。

2つのファイルを追加モードで開くと、fopen("mytext","a");異なる結果が表示されますが、他のFILE *で操作してもインターリーブ出力が発生しないようにするには、FILE *をfflush()する必要があります。また、異なるプロセス/スレッドから同じファイルに書き込む場合は、何らかの形式のファイルロックなど、より注意が必要です。

于 2012-07-30T14:24:54.373 に答える
0

同時に書き込みモードでファイルを開こうとしている2つのファイルポインタがあります。* fはファイルを正常に開き、ファイルへのロックを取得します。コードでは、ファイルは閉じておらず、別のポインターが書き込みモードで同じファイルを開こうとしており、ロックが取得されていないため失敗します。fopen()は、失敗したときに必ずしも0を返すとは限りません。fopen()が失敗すると、0または負の値を返します。この場合、f1 == 0のみをチェックしています。これは、ポインターf1のfopenが失敗し、コンソールに出力されない場合でも真ではない可能性があります。今後、fには有効なオープンファイルが書き込みモードであるため、「hello」がファイルに書き込まれます。しかし、同じファイルに「hi」を書き込もうとしているが、初期化されていない別のポインターを使用している場合、fprintfは失敗します。したがって、「hello」のみがファイルに書き込まれ、「hi」は失敗します。

適切な使用法は、ファイルを開いて「hello」と書き込み、ファイルを閉じてから、書き込みモードで再度開いて「hi」と書き込むことです。この場合、「hello」が上書きされるため、「hi」のみが表示されます。

于 2012-07-30T16:46:08.617 に答える