2014-02-09 4 views
0

Я чувствую, что есть много похожих вопросов, поэтому мне очень жаль, если это дубликат. Однако я не мог найти ответ на этот конкретный вопрос.Как работает getline с cin?

Я смущен относительно того, как getline работает, когда cin передается ему, потому что я понимаю, что он должен вызывать cin каждый раз, когда он вызывается. При работе с кодом, который был в книге, которую я читаю, getline вызывается несколько раз, но отправляется только один вход. Объект cin не вызывается из любого места, кроме как внутри этих вызовов getline.

Что здесь происходит? Когда getline достигнут, программа просто останавливается на своих дорожках и ждет, пока входной поток передаст значение, включая требуемый разделитель? Если это так, делать последующие вызовы getline просто не нужно ждать, потому что у входного потока уже есть данные, включая их соответствующие разделители? Я провел пару тестов, которые предполагали, что это может быть так.

Вот код:

string firstName; 
    getline(cin,firstName,','); 

    string lastName; 
    getline(cin,lastName,','); 

    string job; 
    getline(cin,job,'\n'); 

    cout<<firstName<<" "<<lastName<<" is a "<<job<<endl;; 

Извините еще раз, если это глупый вопрос, но я посмотрел вокруг и действительно не мог найти ответа. Заранее благодарим за любую помощь, которая может быть предоставлена!

Разъяснение:

Этот код выводит "Первый Последний является задание" для консольного ввода "First, Last, Job \ п"

+0

Каждый из них извлекает все до разделителя и включает его, поэтому он не может быть доступен для следующего вызова. – chris

+0

@chris Если не существует более одного разделителя, поскольку он останавливается на первом. – ooga

+0

@JS Что вы подразумеваете под словом «отправляется только один вход»? – ooga

ответ

7

Вызов функции с использованием cin на самом деле не является запросом на ввод пользователя (по крайней мере, не напрямую). Это запрос для символов со стандартного ввода. При нормальной работе программы (когда стандартный ввод не передается из файла или другого источника), стандартный ввод хранится в буфере. Если стандартный входной буфер пуст, а cin запрашивает больше символов, ваша система будет запрашивать ввод от пользователя через терминал. (то есть клавиатуры). Этот вход, который запросы терминала обычно ориентирован на линию. То есть он ждет, пока вы нажмете клавишу . Введите, а затем отправите все данные, которые будут храниться в стандартном буфере ввода. Если cin получает все символы, которые ему нужны до того, как входной буфер пуст, эти символы остаются до следующего запроса.

Так, например, когда вы делаете этот призыв:

getline(cin,firstName,','); 

и входной буфер пуст, Допустим, пользователь вводит это:

Benjamin, Линдли, разработчик программного обеспечения Введите

Во-первых, следующая строка сохраняется во входном буфере:

"Benjamin, Lindley, Software Developer\n" 

Затем getline причины "Benjamin," для чтения из входного буфера (но отбрасывает запятой).

" Lindley, Software Developer\n" 

остается в буфере для любых будущих операций с cin.

+0

Итак, чтобы уточнить, вы подтверждаете мое первоначальное предположение, что программа останавливается и ждет, пока не будет получен правильный вход, если он не видит разделитель в текущем потоке ввода? –

+0

@JS: Да, это правильно. –

+0

Фантастично, спасибо за вашу помощь! –

3

getline "не называют" cin вообще. cin - это объект. Объекты содержат данные. Данные в cin - это информация, необходимая для функций ввода для чтения стандартного входного потока. Если вы хотите прочитать из файла, например, вы должны открыть файл и передать объект файла getline.

Когда вызывается getline, программа считывает все, что находится во входном буфере. Если входной буфер уже содержит разделитель, тогда getline вернется сразу. В противном случае он будет ждать.

+0

Итак, если разделитель ввода не содержит разделителя, когда эта линия будет достигнута, вся программа будет зависеть и только продолжать, когда правильный поток получен из потока? –

+0

Да. Попробуй! – ooga

+0

Прохладный, спасибо за помощь! Я изначально принял ответ Бенджамина Линдли, но я отстранил его (извините Бенджамин), потому что я видел ваше имя. Я подумал, что ты заслужил это, так как ты ответил мне до него в комментариях. Еще раз спасибо! –

Смежные вопросы