1. ホーム
  2. c

[解決済み] fread/fwriteがsizeとcountを引数に取る根拠は何ですか?

2022-11-28 10:44:49

質問

私たちは職場で、なぜ fread() fwrite() は、単にバッファとサイズを受け取るのではなく、メンバーごとのサイズとカウントを受け取り、読み書きのメンバー数を返します。私たちが思いついた唯一の用途は、プラットフォームのアライメントによって均等に分割できない構造体の配列を読み取り/書き込みたい場合であり、そのために水増しされていますが、設計上のこの選択を保証するほど一般的ではないでしょう。

から fread(3) :

関数fread()は、nmemb個のデータ要素を読み込み、それぞれのサイズはバイト長です。 ストリームから読み出し、ptrで指定された場所に格納します。 ptrによって指定された場所に格納します。

<ブロッククオート

関数fwrite()は、nmemb個のデータの要素を、それぞれのサイズバイト のデータを、streamによって指されるストリームに書き込みます。 ptrによって与えられる。

<ブロッククオート

fread()とfwrite()は、読み取りまたは書き込みに成功したアイテムの数を返します。 (つまり、文字数ではありません)。 エラーが発生した場合、または に達した場合、戻り値は短いアイテム数(またはゼロ)です。

どのように解決するのですか?

それは ファイル が実装されている方法に基づいています。

Single UNIX 仕様では

各オブジェクトについて、サイズコールは fgetc()関数に呼び出され、その結果は 読み込まれた順に、結果が オブジェクトに重なる符号なしcharの配列に の配列に格納されます。

fgetc には、こんな注意書きもあります。

fgetc() はバイトを操作するので。 複数のバイトからなる文字を読む 複数バイトからなる文字(またはquot;a multi-byte character")を読み取るには、複数回の呼び出しが必要です。 を複数回呼び出す必要がある場合があります。 を複数回呼び出す必要があるかもしれません。

もちろん、これはUTF-8のような派手な可変バイト文字エンコーディングより前のものです。

SUSは、これが実際にはISO C文書から取られたものであることを指摘しています。