2

私がやろうとしているのは、ファイルを作成し、それにデータを入力し、そのファイルを main() に返す関数を作成することです。問題は、「ファイルを返す」正しい方法は何かということです。ポインター/ファイル記述子を渡すか、これらすべてを無視してファイル名を使用する必要がありますか?

編集:正しい方法を実行する(願っています):

int mkrandfile(const char *name, int range, int qnt) 
{
    FILE *afile;
    int i = 0;

    if (afile = fopen(name, "w+"))
    {
        while((i <= qnt) && fprintf(afile, "%d ", rand() % range - range/2))
            i++;
        fclose(afile);
        if (i != qnt + 1)
            return -2;
    }
    else
        return -1;
}
4

1 に答える 1

3

afileその関数からの戻りが間違っていることは正しいです。ファイルが閉じられると、そのファイル ハンドルは無効になります。呼び出し元がこれを使用すると、未定義の動作が発生します。

モジュール性の観点からはおそらく最良のアイデアではありませんが、ファイルを開いたままにしてからハンドルを返すことができます。しかし、次のいずれかが優れていると思います。

  • 開いているファイル ハンドルを関数に渡します (呼び出し元がファイルを開いたり閉じたりできるようにします)。
  • 呼び出し元にファイルを再度開いてもらいます。

OS によるファイル キャッシュ (該当する場合) を考慮すると、最初のオプションの方が効率的である可能性があります。

于 2012-12-04T23:18:38.733 に答える