2016-02-08 2 views
2

Мне нужно прочитать некоторый ввод, который ограничен пробелами, основная конструкция, которую я использовал для этого, - это :std :: getline пропускает ввод из std :: cin после последнего вхождения разделителя, но не с вводом из std :: istringstream

while(std::getline(std::cin, s, ' ')){ 
    std::cout << s << std::endl; 
} 

для ввода: «это какой-то текст»

выход для S будет: «это», «есть», «некоторые», таким образом, пропуская последний кусок ввода после последнего пробельные.

Я хочу, чтобы включить последнюю часть ввода в моей программе, так что я пошел искать решение и нашел следующее:

while (std::getline(std::cin, line)) { 
    std::istringstream iss(line); 

    while (std::getline(iss, s, ' ')) { 
     std::cout << s << std::endl; 
    } 
} 

Для ввода: «это какой-то текст»

Выход для S будет: «это», «есть», «некоторый», «текст», который именно то, что я хочу.

Вопрос: почему чтение из std :: cin с разделителем пропускает вход после последнего вхождения разделителя, но чтение из std :: istringstream не делает?

+0

Попытка поставить 'зЬй :: CIN >> StD :: skipws;' перед циклом в первом примере и 'станд :: CIN >> станд :: noskipws; 'после цикла. Посмотрите, работает ли это. – HolyBlackCat

+0

Первый пример ждет некоторого '' '', но в конце строки видит только '' '', поэтому он все еще ждет другого '' ''на следующей строке. Во втором случае он попадает в конец потока, поэтому возвращает то, что у него уже есть, даже без конечного '' ''. – BoBTFish

+1

Позвольте мне угадать, что вы не прекратили входной поток при использовании 'std :: cin'. Нажатие кнопки ввода не прекращает считывать данные и далее ожидает ввода. –

ответ

3

Мой вопрос: почему чтение из std::cin с разделителем пропустить ввод после последнего появления разделителя, но чтение из std::istringstream не делает?

Это не так.

В первом примере:

while(std::getline(std::cin, s, ' ')){ 
    std::cout << s << std::endl; 
} 

Вы специально чтения элементов из новой строки, которые буквально разделителями одним пробелом. Поскольку строка (якобы) заканчивается символом новой строки, она никогда не закончит извлечение из входной строки, поскольку она ожидает либо ' ', либо EOF.

В вашем втором примере:

while (std::getline(std::cin, line)) { 
    std::istringstream iss(line); 

    while (std::getline(iss, s, ' ')) { 
     std::cout << s << std::endl; 
    } 
} 

std::getline в первый время будет полоса новой строки из вашего примера предложения. Затем элементы извлекаются в соответствии с некоторыми основными правилами.

Вот правила (from cppreference):

Extracts characters from input and appends them to str until one of the following occurs (checked in the order listed) 
    a) end-of-file condition on input, in which case, getline sets eofbit. 
    b) the next available input character is delim, as tested by Traits::eq(c, delim), in which case the delimiter character is extracted from input, but is not appended to str. 
    c) str.max_size() characters have been stored, in which case getline sets failbit and returns. 
+1

. Стоит особо отметить, что в первом примере ' getline' просто ждет ввода дополнительных данных для завершения чтения строки. –

+0

@Revolver_Ocelot Хороший улов. Будет редактировать. – erip

+1

Отсутствие EOF действительно было проблемой, я глуп. Спасибо, что ответили! он определенно прояснил ситуацию. – HansKlokkenspel

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