fwrite/fread(3) は、歴史的にさまざまなプラットフォームでさまざまな「マルチアイテム」動作を提供しましたか?

fwrite/fread(3) は、歴史的にさまざまなプラットフォームでさまざまな「マルチアイテム」動作を提供しましたか?

さまざまな項目数に追加の引数がありますfread(3)fwrite(3)したがって、通常の書き込みにはcharで始まるバッファしかないため、通常ハードコードされた数があります(例:)fwrite(data, len, 1, stdout)

このパラメータの意味は何ですか?これはいつも便利な「システムが乗算するように」することでしたかcalloc(3)?それとも、一部の過去のオペレーティングシステムおよび/またはストレージデバイスで作成された個々の項目を特別に処理する機能がありましたか?

一部のIBM z / OS文書が偶然発見されたときに好奇心が刺激されました。彼らfwrite()「レコードI / O出力」と「ブロックI / O出力」を区別し、各項目が特定の長さを超えて切り捨てられる方法について説明します。項目数パラメータがマッピング、つまり、分離に使用されるかどうか疑問に思います。物理パンチカード - または少なくともASCII「レコード区切り記号」文字またはその他の文字を使用して、データを後ろから記録できます。

比較すると、POSIX fwrite 仕様ちょうどまっすぐに言ってください:

fputc()各オブジェクトに対して、そのオブジェクトを正確に含む符号なし文字配列から値(順番に)を取得し、関数にサイズ呼び出しを実行する必要があります。

これは、以前のようにバッファと全体の長さを最初にfwrite考慮しない理由について質問します。const uint8_t*size_twrite(2)

答え1

私が知る限り、これらの関数はUnixバージョン7で最初に登場しました、実装する、ちょうど特別な作業を行います。つまり、戻り値を確認するfwriteのではなく、各データブロックを作成してストリームのエラーフラグを確認します。sizeしかし、I / Oエラーが発生したときに追加のサイクルを無駄にする以外に実際の効果はないようです。putcfreadgetc

putcとはどちらも単純なマクロなので、以前よりも速くないとferror思います。fwrite(b, large_val, 1, f)fwrite(b, 1, large_val, f)

fwrite(ptr, size, count, iop)
unsigned size, count;
register char *ptr;
register FILE *iop;
{
        register unsigned s;
        unsigned ndone;

        ndone = 0;
        if (size)
        for (; ndone<count; ndone++) {
                s = size;
                do {
                        putc(*ptr++, iop);
                } while (--s);
                if (ferror(iop))
                        break;
        }
        return(ndone);
}

関連情報