|
Программирование >> Инициализация объектов класса, структура
проверить, находится поток is в хорошем состоянии ошибки: while ( is && ( ch = is.get() ) != lbrace) Если объект istream не в хорошем состоянии, то его значение будет равно false. (О состояниях потока mi расскажем в разделе 20.7.) Данная программа считывает объект класса WordCount, сохраненный оператором вывода #include <iostream> #include WordCount.h int main() { WordCount readIn; operator>>( cin, readIn ) cin >> readIn; if ( !cin ) { cerr << Сшибка ввода WordCount << endl; return -1; } operator<<( cout, readIn cout << readIn << endl; из предыдущего раздела: Выводится следующее: <10> rosebud <11,3> <11,8> <14,2> <34,6> <49,7> <67,5> <81,2> <82,3> <91,4> <97,8> Упражнение 20.9 Оператор ввода класса WordCount сам читает объекты класса Location. Вынесите этот код в отдельный оператор ввода класса Location. поток, чтение из которого невозможно из-за неправильного формата, переводится в состояние fail: is.setstate( ios base::failbit ); операции вставки и извлечения из потока, находящегося в ошибочном состоянии, не работают: while (( ch = is.get() ) != lbrace) Инструкция зациклится, если объект istream будет находиться в ошибочном состоянии. Поэтому перед каждым обращением к get() проверяется отсутствие по умолчанию открывается в режиме вывода файла outfile2 эквивалентно приведенному выше: ofstream outfile2( copy.out ); Если в режиме вывода открывается существующий файл, то все хранившиеся в нем данные пропадают. Если же мы хотим не заменить, а добавить данные, то следует открывать файл в режиме дозаписи: тогда новые данные помещаются в конец. Если указанный файл не существует, то он создается в любом режиме. Прежде чем пытаться прочитать из файла или записать в него, нужно проверить, что if ( ! outfile ) { открыть файл не удалось cerr << не могу открыть copy.out для записи\n ; exit( -1 ); файл был успешно открыт: Класс ofstream является производным от ostream. Все определенные в ostream char ch = ; outFile.put( 1 ).put( ) ).put( ch ); операции применимы и к ofstream. Например, инструкции outFile << 1 + 1 = << (1 + 1) << endl; Упражнение 20.10 Реализуйте оператор ввода для класса Date из упражнения 20.7 в разделе 20.4. Упражнение 20.11 Реализуйте оператор ввода для класса CheckoutRecord из упражнения 20.8 в разделе 20.4. 20.6. Файловый ввод/вывод Если программе необходимо работать с файлом, то следует включить в нее заголовочный файл fstream (который в свою очередь включает iostream): #include <fstream> Если файл будет использоваться только для вывода, мы определяем объект класса ofstream. Например: ofstream outfile( copy.out , ios::base::out ); Передаваемые конструктору аргументы задают имя открываемого файла и режим открытия. Файл типа ofstream может быть открыт либо - по умолчанию - в режиме вывода (ios base::out), либо в режиме дозаписи (ios base::app). Такое определение #include <fstream> int main() { открыть файл copy.out для вывода ofstream outFile( copy.out ); if ( ! outFile ) { cerr << Не могу открыть copy.out для вода\n ; return -1; char ch; while ( cin.get( ch ) ) outFile.put( ch ); стандартный вывод: К объекту класса ofstream можно применять и определенные пользователем экземпляры оператора вывода. Данная программа вызывает оператор вывода класса WordCount из #include <fstream> #include WordCount.h int main() { открыть файл word.out для вывода ofstream oFile( word.out ); здесь проверка успешности открытия ... создать и вручную заполнить объект WordCount WordCount artist( Renoir ); artist.found( 7, 12 ); artist.found( 34, 18 ); вызывается оператор (ostream&, const WordCount&); oFile << artist; предыдущего раздела: Чтобы открыть файл только для чтения, применяется объект класса ifstream, производного от istream. Следующая программа читает указанный пользователем файл и копирует его содержимое на стандартный вывод: выводят в файл outFile последовательность символов: [ТТ 1 + 1 = 2 I Следующая программа читает из стандартного ввода символы и копирует их в
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |