|
Программирование >> Инициализация объектов класса, структура
if ((ch = is.get()) != < ) is.setstate( ios base::failbit ); return is; объекта istream: ios base::badbit ios base::eofbit ios base::failbit Имеются следующие значения флагов состояния: ios base::goodbit Для установки сразу нескольких флагов используется побитовый оператор ИЛИ: is.setstate( ios base::badbit ios base::failbit ); if ( !cin ) { cerr << Сшибка ввода WordCount << endl; return -1; При тестировании оператора ввода в классе WordCount (см. раздел 20.5) mi писали: Возможно, вместо этого мы предпочли бы продолжить выполнение программы, предупредив пользователя об ошибке и попросив повторить ввод. Но перед чтением нового значения из потока cin необходимо перевести его в нормальное состояние. Это можно сделать с помощью функции-члена clear() : cin.clear(); сброс ошибок ifstream iFile( filename, ios base::in ); if ( iFile.fail() ) не удалось открыть error message( ... ); good() возвращает true, если все вышеперечисленные условия ложны: if ( inOut.good() ) Существует два способа явно изменить состояние потока iostream. С помощью функции-члена clear() ему явно присваивается указанное значение. Функция setstate() не сбрасывает состояние, а устанавливает один из флагов, не меняя значения остальных. Например, в коде оператора ввода для класса WordCount при обнаружении неверного формата мы используем setstate() для установки флага fail в состоянии ios base::iostate old state = cin.rdstate(); cin.clear(); process input(); перевести поток cin в прежнее состояние Функция-член rdstate() позволяет получить текущее состояние объекта: cin.clear( old state ); Упражнение 20.15 Измените один (или оба) оператор ввода для класса Date из упражнения 20.7 и/или класса CheckoutRecord из упражнения 20.8 (см. раздел 20.4) так, чтобы они устанавливали состояние объекта istream. Модифицируйте программ:, которыми вы пользовались для тестирования этих операторов, для проверки явно установленного состояния, вывода его на печать и сброса в нормальное. Протестируйте программы, подав на вход правильные и неправильные данные. 20.8. Строковые потоки Библиотека iostream поддерживает операции над строковыми объектами в памяти. Класс ostringstream вставляет символы в строку, istringstream читает символы из строкового объекта, а stringstream может использоваться как для чтения, так и для записи. Чтобы работать со строковым потоком, в программу необходимо включить заголовочный файл #include <sstream> Например, следующая функция читает весь файл alice emma в объект buf класса ostringstream. Размер buf увеличивается по мере необходимости, чтобы вместить все символы: В более общем случае clear() используется для сброса текущего состояния и установки одного или нескольких флагов нового. Например: cin.clear( ios base::goodbit ); восстанавливает нормальное состояние потока. (Оба вызова эквивалентны, поскольку goodbit является для clear() аргументом по умолчанию.) #include <string> #include <fstream> #include <sstream> string read file into string() { ifstream ifile( alice emma ); ostringstream buf; char ch; while ( buf && ifile.get( ch )) buf.put( ch ); return buf.str(); Функция-член str() возвращает строку - объект класса string, ассоциированный со строковым потоком ostringstream. Этой строкой можно манипулировать так же, как и обычным объектом класса string. Например, в следующей программе text почленно int main() { string text = read file into string(); запомнить позиции каждого символа новой строки vector< string::size type > lines of text; string::size type pos = 0; while ( pos != string::npos ) pos = text.find( \n pos ); lines of text.push back( pos ); } ... инициализируется строкой, ассоциированной с buf: Объект класса ostringstream можно использовать для автоматического форматирования составной строки, т.е. строки, составленной из данных разных типов. Так, следующий оператор вывода автоматически преобразует любой арифметический тип в соответствующее строковое представление, поэтому заботиться о выделении нужного количества памяти нет необходимости:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |