2012-02-23 11 views
6

Мой код выглядит так,GetLine (CIN, aString) прием входных данных без другого входа

string aString; 
cin >> aString; 
cout << "This is what cin gets:" << aString << endl; 
getline(cin, aString); 
cout << "This is what getline(cin, <string>) gets:" << aString << endl; 

Каждый раз, когда я побежал, я даю входы, как, «12», я получаю «12» и «» ,

Мне интересно, почему getline будет получен без ввода пользователем.

Я могу понять, когда я вхожу что-то вроде «12 24», cin получит «12», и getline должен получить все остальное. (Кроме того, если можно было бы ответить, промежуток между ними обрабатывается как конец для cin, так почему он передается на getline?)

Просто начинайте с строки на C++, поэтому, пожалуйста, не делайте это слишком сложно , Спасибо вам.

+0

Если вы уже получили входные данные, вам больше нечего делать, если есть больше ввода ... – AJG85

ответ

12

Когда вы смешиваете стандартное извлечение потока с помощью getline, вы иногда получаете getline, возвращаете пустую строку. Причина этого в том, что если вы читаете ввод с помощью >>, символ новой строки, введенный пользователем, чтобы сигнализировать о том, что они сделаны, не удаляется из входного потока. Следовательно, когда вы вызываете getline, функция будет читать оставшийся символ новой строки и возвращать пустую строку.

Чтобы это исправить, либо последовательно использовать GetLine для ввода, или использовать Ws поток манипулятором для извлечения дополнительного белого пространства после чтения:

cin >> value >> ws; 

Это будет съедать символ новой строки, фиксируя проблему.

Надеюсь, это поможет!

7

это то, что я получаю:

std::string str; 
std::cin >> str; //hello world 
std::cout << str; //hello 

это потому, что оператор потока размечает на белом пространстве

std::string str; 
std::getline(std::cin, str); //hello world 
std::cout << str; //hello world 

вы получите полную строку, GetLine() работает, пока не будет найден первый конец строки и возвращает это значение как строку.

Однако, если в токенинге есть символы (например, '\ n'), оставшиеся в потоке, тогда они будут доступны, когда вызывается getline, вам нужно очистить поток.

std::cin.ignore(); 
1

«cin >> x» не использует символ новой строки из входного потока, поэтому следующая строка, которую вы получаете с помощью getline, будет содержать пустую строку. Один из способов решения этой проблемы - использовать getline для извлечения ввода по строкам и использовать stringstream для tokenize каждой строки. После того, как вы извлекли все данные из строкового потока, ключевым моментом является вызов stringstream :: clear(), чтобы очистить флаг EOF, установленный в потоке строк, чтобы иметь возможность повторно использовать его позже в коде.

Вот пример:

#include <iostream> 
#include <sstream> 
#include <string> 

using namespace std; 

int main() { 
    string line; 
    stringstream ss; 
    getline(cin, line); 
    ss << line; 
    int x, y, z; 
    //extract x, y, z and any overflow characters 
    ss >> x >> y >> z >> line; 
    ss.clear(); 
    //reuse ss after clearing the eof flag 
    getline(cin, line); 
    ss << line; 
    //extract new fields, then clear, then reuse 
    //... 
    return 0; 
} 

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