1

私はそれfwriteが次のパラメータを取ることを知っています:

fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

私の知る限り、これsize_tは typedef であり、以下のものに他なりません。

typedef unsigned long size_t;

size_tcount と writeより大きな値を使用することはできますか? そうでない場合は、書かれたブロックをどうにかして接続できますか?

4

4 に答える 4

2

いいえ、型fwriteに適合する値のみを受け入れますsize_t

より多くを記述する実装固有の方法があるかもしれませんが、標準 C の場合、アプローチは通常、順次fwrite呼び出しを行うことです。後続の各呼び出しは、既に記述したものに追加されます。

size_tそして、それは異なるタイプであることを覚えておいてください。一部の実装で定義されている場合がありますunsigned longが、それは保証されていません。

于 2013-08-05T22:28:36.900 に答える
1

を使用するfwriteには、記述しているオブジェクト全体が が指すオブジェクト内にある必要がありますptr。本当にめちゃくちゃな C 実装を持っていない限り、オブジェクトを の最大値よりも大きくすることは不可能ですsize_t。したがって、それよりも多くのバイトを書き込もうとすると、プログラミング エラーになります。 .

于 2013-08-05T22:29:38.623 に答える
1

アプリケーション プログラマの観点から見ると、ファイルは連続した一連のバイトです。連続した書き込みは、データをファイルに順番に配置します。(このコメントは、あなたの質問に関係のない詳細について議論する人もいるため、必要です)。

したがって:

fwrite(&user_record1, sizeof(user_record1), 1, fp);
fwrite(&user_record2, sizeof(user_record2), 1, fp);

ファイル上に 2 つのユーザー レコードが作成され、一方が他方の直後に続きます。

非常に大きなレコードがある場合は、次のように 2 つの小さなレコードに分割します。

fwrite(&user_record_parta, sizeof(user_record1), 1, fp);
fwrite(&user_record_partb, sizeof(user_record2), 1, fp);

ただし、このような大規模なレコードを使用するアプリケーションの設計には疑問があります。おそらく、アプリケーションで実際に行っていることは、ユーザー レコードの配列を作成することであり、その配列は非常に大きくなります。この場合、配列全体ではなく、配列の各エントリを書き込みます。

于 2013-08-05T22:43:15.007 に答える
0

それより大きい値を使用するULONG_MAXと、0 にラップアラウンドします。

できることは、ULONG_MAXバイトを書き込み、最後の位置までシークして書き込みを続け、すべてのデータを書き込むまでループでそれを繰り返すことです。

于 2013-08-05T22:28:07.003 に答える