6

呼び出すことは完全に大丈夫ですか(=標準に従って明確に定義された動作):

mystream.read(buffer, 0);

また

mystream.write(buffer, 0);

(そしてもちろん、何も読み書きされません)。これらの2つの関数のいずれかを呼び出す前に、指定されたサイズがnullかどうかをテストする必要があるかどうかを知りたいです。

4

2 に答える 2

8

はい、動作は明確に定義されています。両方の関数は、フォーマットされていない入出力関数の動作を実行し(歩哨の構築、eofbitが設定されている場合はフェイルビットの設定、必要に応じてタイストリームのフラッシュ)、この句に到達します。 :

§27.7.2.3[istream.unformatted]/30

次のいずれかが発生するまで、文字が抽出されて保存されます。

—n文字が格納されます。

§27.7.3.7[ostream.unformatted]/5

次のいずれかが発生するまで文字が挿入されます

—n文字が挿入されます。

「ゼロ文字が格納/挿入される」は、何かが格納または抽出される前に真になります。

実際の実装を見ると、同等のループを持つfor (; gcount < n; ++gcount) libc++またはsgetn(buffer, n); stdlibc++にあります。

于 2012-10-22T15:21:25.753 に答える
0

からの別の抽出27.7.2.3 Unformatted input functions/1により、ゼロサイズの入力バッファが有効な場合であるという手がかりが得られます。

ゼロ以外のサイズの文字配列を引数として取るフォーマットされていない入力関数も、配列の最初の場所にヌル文字(charT()を使用)を格納する必要があります。

于 2012-10-22T15:33:48.213 に答える