2

std::stringstreamファイルを解析し、 を使用してその内容を解析したいと考えています。私はget()それを文字ごとに読んでいましたが、std::stringstream::int_type. 場合によっては、ルックアップ テーブルを使用して ASCII 文字を他の値に変換したいことがあります (たとえば、特定の文字が識別子で許可されているかどうかを判断するため)。

get()取得した値は負でない限り、負ではないと仮定できstd::stringstream::traits_type::eof()ますか? (したがって、それらをルックアップ テーブルのインデックスとして使用します)。

それに関する標準には何も見つかりませんでした。これは、このバイト全体から文字への変換が C++ でどのように機能するかを理解していないことが原因である可能性があります。

4

1 に答える 1

1

まず、basic_stringstream のより一般的なケースを見てみましょう。

それが負であると仮定することはできませんeof()(制約はどこにも見当たりません。C 標準では、マクロ WEOF の値は EOF の値と異なる場合があり、負である必要はありません。 )

一般にint_type、trait パラメーターから来て、 for character traits の説明は、正の値を返すことint_typeを義務付けていません。to_int_type

さて、stringsteamですので、 ;basic_stringstream<char>を使用します。負ですが、非負の値を持つ義務は見つかりませんでした (21.2.3.1 にはありません。他の制約からそれを推測する方法はありません)。これは同等でなければなりませんでした-- これは GNU 標準 C++ ライブラリの場合であり、文字を取得または返す関数が文字に対して非負の値を返すC と同じ動作になることを多少期待しています。)char_traits<char>eofto_int_typeto_int_type(c)(int)(unsigned char)cint

情報については、 の他の標準的な特殊化char_traits:

  • char_traits<char16_t>char_traits<char32_t>unsignedを持っているint_typeので、偶数eof()は正です。

  • char_traits<wchar_t>::to_int_typeeof()入力に対して正の値を返すことも義務付けられていません(ただし、char_traits<char>そのような義務があるとは思っていなかったのとは対照的です)。

于 2013-06-11T11:24:41.433 に答える