|
Программирование >> Инициализация объектов класса, структура
cin >> item number; if ( ! cin ) cerr << ошибка: введено некорректное значение item number!\n ; Хотя сцепление операторов ввода поддерживается, проверить корректность каждой отдельной операции нельзя, поэтому пользоваться таким приемом следует лишь тогда, #include <iostream> #include <string> int main() { int item number; string item name; double item price; cout << Пожалуйста, введите item number, item name и price: << endl; хорошо, но легче допустить ошибку cin >> item number >> item name >> item price; cout << Введены значения: item# << item number << << item name << @$ << item price << endl; когда ошибка невозможна. Наша программа теперь выглядит так: Последовательность d e составлена из девяти символов: a, b, (пробел), c, \n (переход на новую строку), d, \t (табуляция), e и \n. Однако приведенная программа читает лишь #include <iostream> int main() { char ch; прочитать и вывести каждый символ while ( cin >> ch ) cout << ch; cout << endl; пять букв: #include <iostream> int main() { char ch; читать все символы, в том числе пробельные cin.get( ch )) cout.put( ch ); while ( cin.get( ch ... член put() класса ostream; они будут рассмотрены ниже). Например: Другая возможность сделать это - использовать манипулятор noskipws. Каждая из двух данных последовательностей считается составленной из пяти строк, разделенных пробелами, если для чтения используются операторы ввода с типами const char* или string: A fine and private place A fine and private place Наличие кавычек не делает пробелы внутри закавыченной строки ее частью. Просто открывающая кавычка становится начальным символом первого слова, а закрывающая -конечным символом последнего. Вместо того чтобы читать из стандартного ввода по одному символу, можно воспользоваться потоковым итератором istream iterator: И печатает следующее: Pabcde По умолчанию все пустые символы отбрасываются. Если нам нужны и они, например для сохранения формата входного текста или обработки пустых символов (скажем, для подсчета количества символов перехода на новую строку), то можно воспользоваться функцией-членом get() класса istream (обычно в паре с ней употребляется функция- #include <algorithm> #include <string> #include <vector> #include <iostream> int main() istream iterator< string > in( cin ), eos ; vector< string > text ; копировать прочитанные из стандартного ввода значения в вектор text copy( in , eos , back inserter( text ) ) ; sort( text.begin() , text.end() ) ; удалить дубликаты vector< string >::iterator it; it = unique( text.begin() , text.end() ) ; text.erase( it , text.end() ) ; вывести получившийся вектор int line cnt = 1 ; for ( vector< string >::iterator iter = text.begin() ; iter != text.end() ; ++iter , ++line cnt ) cout << *iter << ( line cnt % 9 ? : \n ) ; cout << endl; Пусть входом для этой программе! будет файл istream iter.C с исходным текстом. В системе UNIX мы можем перенаправить стандартный ввод на файл следующим образом (istream iter - имя исполняемого файла программы): istream iter < istream iter.C (Для других систем необходимо изучить документацию.) В результате программа выводит: != \n #include % ( ) *iter ++iter ++line cnt , 1 9 : ; << <algorithm> <iostream.h> <string> <vector> = > >::difference type >::iterator ? allocator back inserter( cin copy( cout diff type eos for in in( int istream iterator< it iter line cnt main() sort( string test test.begin() test.end() test.erase( typedef unique( vector< { } (Потоковые итераторы ввода/вывода iostream рассматривались в разделе 12.4.) Помимо предопределенных операторов ввода, можно определить и собственные перегруженные экземпляры для считывания в пользовательские типы данных. (Подробнее мы расскажем об этом в разделе 20.5.)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |