Ввод в языке C++ через cin

Использование объекта cin

Для считывания данных со стандартного ввода используется объект cin, также определенных в заголовочном файле iostream. Его использование похоже на использование объекта cout для вывода. Например, для считывания двух переменных a и b нужно дать команду:

cin >> a >> b;

Также как и в случае с cout, нет нужды беспокоиться о типах данных - можно считывать целые и действительные числа, символы и строки.

Особенности считывания символов

Пусть дано время в формате HH:MM. Считать его можно следующим образом:

int h, m;
char c;
cin >> h >> c >> m;

То есть сначала считывается число, затем - символ, затем - число.

При этом при считывании символа пропускаются пробельные символы (пробелы и концы строк) и считывается следующий непробельный символ. Например, если при запуске приведенного выше кода ввести "12 34", то переменная h станет равна 12, переменная с -- '3', а переменная m -- 4.

Если установить манипулятор noskipws:

cin >> noskipws;

то при считывании символов пробельные символы не будут пропускаться. Для восстановления режима пропуска пробельных символов используется манипулятор skipws:

cin >> noskipws;

Особенности считывания строк

Считывание строк при помощи cin >> s, где s - объект класса string или C-строка приведет к считыванию строки из непробельных символов, при этом пробельные символы пропускаются.Использовать манипулятор noskipws при чтении строк не следует.

Строку целиком до конца строки, вместе с пробельными символами можно считать следующим образом:

getline(cin, s);

Отметим следующую особенность такого считывания. Пусть входные данные заданы так - сначала число строк n, затем - n строк, возможно, содержащие пробелы. Требуется считать данные строки и сохранить их в массиве строк.

Правильное решение будет таким:

int n;
string s,  A[100];
cin >> n;
getline(cin, s);
for (int i = 0; i < n; ++i)
    getline(cin, A[i]);

Здесь нужно обратить внимание на "лишний" вызов getline после считывания числа n. Дело в том, что cin >> n не считывает конец строки из потока, поэтому последующий вызов getline вернет пустую строку (но зато считает конец строки), поэтому нужно сделать один "холостой" вызов getline перед считыванием всех остальных строк.

Значение, возвращаемое при считывании

Для проверки успешности считывания можно преобразовать значение, возвращаемое операцией считывания к типу bool. Например, следующим образом:

bool is_correct;
int a;
is_correct = (cin >> a);

Если значение переменной is_correct будет true, то считывание было успешно, иначе - нет.

Вместо записи результата в логическую переменную, можно непосредственно использовать его, например, в условной инструкции. Вот так, например, можно проверять, что на вход программе подано два числа через двоеточие:

int h, m;
char c;
if (cin >> noskipws >> h >> c >> m)
{
    if (c == ':') ...
}

Похожее использование - чтение текста "по словам", с обработкой каждого слова:

string word;
while (cin >> word)
{
   // Обработать слово в переменной word
}

Или считывание текста по строкам:

string line;
while (getline(cin, s))
{
    // Обработать строку в переменной line
}