3

私はオブジェクトのwriteメソッドを読んでいbasic_ostreamますが、これは cppreference で見つけたものです:

basic_ostream& write( const char_type* s, std::streamsize count );

として動作しUnformattedOutputFunctionます。歩哨オブジェクトを構築してチェックした後、最初の要素が によって指されている文字配列内の連続する位置から文字を出力しますs。次のいずれかが発生するまで、文字が出力シーケンスに挿入されます。

  • 正確にcount文字が挿入されます
  • 出力シーケンスへの挿入が失敗する (この場合、setstate(badbit)が呼び出されます)

したがって、バッファからストリームに文字のチャンクを書き込むことがわかります。また、文字数は で指定したバイト数countです。しかし、よくわからないことがいくつかあります。これらは私の質問です:

  • ストリームに書き込みたいバイト数をwrite指定たい場合にのみ使用する必要がありますか? 通常、char配列を印刷すると、null バイトに達するまで配列全体が印刷されますが、使用するwrite場合は、書き込む文字数を指定できます。

    char greeting[] = "Hello World";
    
    std::cout    << greeting;     // prints the entire string
    std::cout.write(greeting, 5); // prints "Hello"
    

    しかし、多分私はこれで何かを誤解しています。

  • そして、これを使用するコード サンプルでよく見かけますwrite

    stream.write(reinterpret_cast<char*>(buffer), sizeof(buffer));
    

    reinterpret_casttochar*が使われているのはなぜですか?ストリームに書き込むときに、そのようなことをいつ行うべきかを知る必要がありますか?

誰かがこれら2つの質問で私を助けることができれば、それは大歓迎です.

4

2 に答える 2

1

basic_ostream::writeおよび対応basic_istream::readする は、データ ストリームでフォーマットされていない I/O を実行するために使用されます。通常、これは生のバイナリ データであり、印刷可能な ASCII 文字を含む場合と含まない場合があります。

read/と、などのwrite他の書式付き演算子との主な違いは、前者は処理対象のデータをまったく想定していないことです。つまり、ストリームから読み取ってストリームに書き込むバイトを完全に制御できます。空白をスキップする可能性がある後者と比較して、それらを破棄または無視するなど.<<>>getline

2 番目の質問に答えるにreinterpret_cast <char *>は、関数のシグネチャを満たし、一度に 1 バイトずつバッファを処理するために存在します。タイプにchar惑わされないでください。使用される理由charは、言語によって提供される最小の組み込みプリミティブ型であるためです。おそらく、uint8実際には符号なしのバイト型であることを示すような名前の方が適切でしょう。

于 2013-06-13T01:46:28.783 に答える