これでc ++ 17にはstd::byte
、ファイルをchar
に読み取るコードを、byte
にファイルを読み取るコードに変換する方法を探していました。ファイルには、整数の束ではなくバイトが含まれています。
次に、私は この質問 と この他の質問 を読んで、ファイルをbyte
に読み取るのは間違っており、char
にファイルを読み取るのは正しいと主張しました。
byte
がメモリへのアクセスを目的として設計されていない場合、類推すると、ファイルの目的は何ですか?他の2つで引用されているとおり質問:
Charやunsigned charと同様に、他のオブジェクト(オブジェクト表現)が占有するrawメモリへのアクセスに使用できますが、これらのタイプとは異なり、文字タイプではなく、算術タイプでもありません。バイトはビットのコレクションにすぎず、ビットごとの論理演算子のみが定義されています。
これは、文字ではなく、ファイルの読み取りに使用する必要がある正確なタイプのように聞こえます。
あなたはおそらく物事を誤解しているでしょう。
byte
は、「メモリへのアクセス」を目的としています。ストレージが文字の配列ではなく単なるバイトのシーケンスである場合に、タイプを使用することを目的としています。
Iostream型はbyte
で特化することはできません。それらはインターフェイスとして文字を中心に設計されているためです。つまり、ファイルをバイトのシーケンスと見なしません。彼らはそれらを一連の文字と見なします。これで、1つまたは2つのキャストを使用して、byte
配列に直接読み取ることができます。しかし、これはiostreamがネイティブに考える方法ではありません。
Iostreamの動作とfilesの動作を区別する必要があります。 Iostreamは1つのファイルにすぎませんIOライブラリ、結局のところ、それはほとんどすべてのファイルAPIの終わりではありません。
バイナリデータを読み取るためのほとんどのファイルAPIは、文字配列ではなくvoid*
を使用します。 std::fread/fwrite
など。
つまり、これをstd::byte
の問題ではなく、iostreamの問題と考える必要があります。それらの長い行のちょうど別のもの。