2013-06-11 1 views
2

Я хочу проанализировать файл и использовать для анализа его содержимого. Я использую get(), чтобы прочитать его символ по символу, который дает std::stringstream::int_type. Теперь в некоторых случаях я хочу использовать таблицу поиска для преобразования символов ascii в другие значения (например, для предотвращения того, разрешен ли определенный символ в идентификаторе или нет).Всегда ли можно предположить, что значения .stream :: int_type are> = 0, за исключением eof

Теперь я могу предположить, что значения, которые я получаю от get(), неотрицательны, если это не std::stringstream::traits_type::eof()? (И, следовательно, используйте их как индексы для таблиц поиска).

Я не мог найти что-либо в стандарте относительно этого, что может быть из-за отсутствия понимания с моей стороны, как все эти байты для персонажей работают на C++.

ответ

1

Сначала рассмотрим более общий случай basic_stringstream.

Вы не можете предположить, что eof() отрицательна (я вижу ограничение нигде и стандартные состояния C Значение макро WEOF может отличаться от EOF и не должны быть отрицательными.)

В общий, int_type исходит из параметра признака, а описание int_type для черт характера не означает, что to_int_type возвращает что-то положительное.

настоящее время, stringsteam является basic_stringstream<char> и таким образом использует char_traits<char>; eof отрицательный, но я не нашел мандата, что to_int_type имеет неотрицательные значения (это не в 21.2.3.1, и я не вижу возможности вывести его из других ограничений), но мне интересно, пропустил ли я что-то, ожидание состояло в том, что to_int_type(c) должен был быть эквивалентен (int)(unsigned char)c - это в случае стандартной библиотеки C++ GNU, и я несколько ожидаю получить то же поведение, что и в C, где функции, принимающие или возвращающие символы в int, возвращают неотрицательные значения для символов.)

Для получения дополнительной информации, а другой стандарт специализации char_traits:

  • char_traits<char16_t> и char_traits<char32_t> имеют неподписанный int_type, поэтому даже eof() положительный;

  • не имеет права возвращать положительное значение для ввода eof() (но в отличие от char_traits<char> Я не ожидал, что такой мандат будет там).

+0

'станд :: stringstream' является' станд :: basic_stringstream '' так использует char_traits 'поэтому ограничение "г. Член 'EOF()' возвращает 'EOF'." из [char.traits.specializations.char] применяется, а 'EOF' - отрицательный. –

+0

@CharlesBailey, о, хотя вопрос был о 'std :: basic_stringstream ' и поэтому дал более общий ответ, чем нужно, я его обновил. – AProgrammer

+0

Благодарим вас за ответ. Моя проблема хотя и меньше о знаке 'eof()', а скорее знаке символов ASCII (который я хочу использовать в качестве индексов для lookup_table). –

Смежные вопросы