Программирование >>  Инициализация объектов класса, структура 

1 ... 352 353 354 [ 355 ] 356 357 358 ... 395


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 можно использовать для автоматического форматирования составной строки, т.е. строки, составленной из данных разных типов. Так, следующий оператор вывода автоматически преобразует любой арифметический тип в соответствующее строковое представление, поэтому заботиться о выделении нужного количества памяти нет необходимости:



1 ... 352 353 354 [ 355 ] 356 357 358 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика