модуль (або як кажуть у випадку з Сі – заголовок) або заголовки iostream покликаний надати кошти введення-виведення, для стандартної консолі. Тобто,. те, що вводить з клавіатури і читає з екрану користувач.
Всі його можливості розміщені в просторі імен std, тому для його використання або доводиться приписувати префікс std, або вказувати простір імен через використовуючи простір імен
1 2 3 4 | using namespace std; ... cin >> Переменная; cout << "Чет там"; |
або
1 2 | std::cin >> Переменная; std::cout << "Чет там"; |
У цій статті будемо використовувати перший варіант – підключення простору імен через використовуючи простір імен.
iostream містить два основні класи:
- cin – для обробки введення з клавіатури;
- cout – для виведення в консоль змінних або просто тексту;
Є ще класи Palau і засмічення, але їх в цілому, використовують не так часто, і про них ми згадувати не будемо. Якщо кому цікаво – ці класи використовують для виведення помилок при операціях і для логування дій.
відразу скажу, що не все, що притаманне цим класам буде описано. Тільки саме часто використовується з функціоналу. Це оператори перенаправлення форматированного виведення (<< і >>), які займаються виведенням значень змінних в залежності від їх типів і зазначеного формату. Це оператори неформатированного читання запису (читай: ноги мого будинку або posimvolьno), методи get(), ставити() і запис() покликані просто вивести масив символів якими б вони не були. І оператори форматування SETF(), ширина(), точність(), які вказують для поточного виведення, як форматувати виведене, як вирівнювати його, по якій стороні і скільки ставити символів після коми.
клас cin
клас cin містить безліч методів. Всі їх можна побачити, якщо ввести в середовищі розробки ключове слово cin і поставити після нього точку. Редактор коду запропонує всі наявні методи цього класу на вибір:
Як сказано вище, для початківців програмістів, ми розглянемо тільки деякі з них.
клас cin заснований на класі IStream, і містить можливість перенаправлення вводу. Використовуючи перевантаження оператора >> , клас дозволяє вказати в яку змінну буде проводитися введення даних.
1 2 3 4 5 | double d; int i; string s; cin >> d >> i >> s; |
Перераховані в прикладі змінні отримують (зчитують) свої дані відповідно до своїх позиціях в операції. В даному прикладі спочатку зчитується речовий в d, потім ціле в i, і потім строкова змінна. Це потрібно обов'язково враховувати – неправильна послідовність змінних може дати або помилку введення, або змінні можуть отримати дані їм не призначаються.
При зчитуванні рядки потрібно пам'ятати, що якщо при в ній зустрінеться пробіл, зчитування завершиться (в операційній системі прийнято параметри відокремлювати пробілами). Так зручно розбивати рядок на слова. Проілюструвати це можна таким прикладом:
1 2 3 4 5 6 7 8 9 10 | #include <iostream> #include <string> using namespace std; int main() { string s; for (cin >> s; !cin.eof(); cin >> s) cout << s << endl; } |
З особистого досвіду я не рекомендую застосовувати саме такий метод розподілу рядки на слова, але знати про це корисно.
Якщо потрібно вважати рядок цілком до перенесення каретки, варто використовувати розглянутий нижче метод getline().
метод get()
Дозволяє ввести символ або рядок. При введенні стоки підтримує роздільник, зазначений програмістом, до якого буде читатися рядок. За замовчуванням варто символ перекладу рядка ' П' Тобто метод get() чекає натискання клавіші Ентер. Тільки потім обробляє прочитуване.
При введенні символу в числову змінну, метод повертає код цього символу:
1 2 | int c = cin.get(); // Получаем код символа char c = cin.get(); // Или сам символ |
cin.get() часто ставлять в кінці програми, щоб затримати консоль з результатами:
1 2 3 4 | ...... cin.get(); return 0 } |
У класичному Сі популярним аналогом є функція GetChar() для такої затримки.
Щоб зробити за допомогою цього методу введення рядка, досить передати в його параметри покажчик на масив символів, куди буде проводитися запис, і кількість символів, яке очікується для введення.
1 2 3 4 5 6 7 8 9 | int n = 10; char *s = new char[n]; cout << "\nВведите строку из 10 символов: "; cin.get(s,n); cout << "Строка: " << s << endl; delete [] s; //Остальное, если строку ввели в размере более n символов - отсекаем (игнорируем) сin.ignore(); |
схема проста: Передаємо покажчик на масив символів, передаємо кількість зчитуваного, і після натискання клавіші Ентер, cin.get() вважає в цей масив задану кількість символів. Решта символів вважається не будуть, тому щоб звільнити від них буфер введення можна викликати метод ігнорувати().
Якщо вказати третім параметром символ-роздільник, cin.get() буде зчитувати або скільки замовлено символів, або поки cin не зустріне цей символ:
1 | cin.get(s,n,' '); |
тут в s рядок зчитуються символи аж до першого пробілу. Якщо прогалин не виявиться – зчитуватися буде або до натискання Ентер або до n-е мають багато символів.
метод getline()
аналогічний методу get(). Крім усього, що “вміє” get(), перевизначений для рядків типу string. Так само як і get() вміє зчитувати до символу, вказаного як роздільник, так само перший параметр масив символів, а другим кількість символів для зчитування.
Використання його перевизначення версії в хедері string виглядає так:
1 2 | string s; getline(cin,s); |
вартість Клас
клас cout передбачає виведення даних в консоль. базовий клас ostream. основний оператор – перевантажений << він вказує, яку змінну виводити в консоль.
1 2 3 4 5 | double d = 1; int i = 2; string s = "123"; cout << d << i << s; |
Правила послідовності ті ж, що в cin – висновок зліва направо.
Для перекладу каретки на новий рядок рекомендується використовувати оператор endl. Або передавати старий добрий ' П’
1 | cout << d << i << s << endl; |
1 | cout << d << i << s << '\n'; |
метод ставити() виводить символ в консоль:
1 | cout.put('В'); |
Виведе один символ.
метод запис() виведе блок символів з масиву символів, переданий йому в якості покажчика
1 2 3 4 5 6 7 8 9 10 | #include <iostream> using namespace std; int main() { char *s = "Hello"; cout.write(s, strlen(s)); cout << endl; cout.write(s, 2); cout << endl; } |
В принципі, в запис() можна передавати покажчик на будь-який блок пам'яті, але для виведення в консоль характерні тільки масиви читаються, зрозумілих людині символів.
метод ширина() задає ширину виведеного, якщо необхідно вирівняти до певної кількості символів. Як правило застосовується при побудові таблиць. типовий приклад: Висновок таблиці обчислення формули (приклад нижче).
метод точність() вказує скільки цифр буде в дробової частини, якщо виводиться речова змінна.
метод SETF() визначає, як буде вирівнюватися (вліво, вправо, по центру) виведене, і в якому форматі вона буде.
Комплексний приклад цих методів можна побачити в завданні побудови таблиці параболи:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <iostream> using namespace std; int main() { setlocale(LC_ALL, "rus"); double x; // Указываем дополнить слово "Парабола" до 15 символов пробелами cout.width(15); cout << "Парабола" << endl; // Указываем дополнить слово "Х" до 10 символов пробелами cout.width(10); cout << "X" << endl; // Указываем дополнить слово "Y" до 10 символов пробелами cout.width(10); cout << "Y" << endl; // Указываем что выравниваться выводимое будет справа // Т.е. пробелы дополнятся слева cout.setf(ios::right); for (x = 0; x < 10; x += 1){ cout.width(10); cout << x << '|'; cout.width(10); cout << x*x << '|' << endl; }; } |
16-тиричном уявлення рядки можна вивести, например, ось так :
1 2 3 4 5 6 7 8 9 10 11 | #include <iostream> using namespace std; int main() { char *s = "figaro"; cout.setf(ios::hex, ios::basefield); for (int i = 0; s[i]; i++) cout << (int)s[i] << ' '; cout << endl; } |
А так науковий формат уявлення речового:
1 2 3 4 5 6 7 8 | #include <iostream> using namespace std; int main() { cout.setf(ios::scientific); cout << 123.456; cout << endl; } |
Можна задати формат виведення булевских змінних:
1 2 3 4 5 6 7 8 | #include <iostream> using namespace std; int main() { cout << false << endl;//Выведет 0 - целый вид false cout.setf(ios::boolalpha); cout << false << endl; //Выведет строкой "false" } |
Попрацюйте з методами цих класів самостійно. Постарайтесь понять, що робить кожен з них. Така самостійна практика буде вам дуже корисна.
Нові уроки з програмування: |
метод ігнорувати().
І оператори форматування SETF(), ширина(), точність(),
і так далі. Що за переклад?