2015-09-06 2 views
1

Я почти уверен, что этот вопрос задал вопрос, но после долгого поиска я до сих пор не могу найти ответ. Я извлек этот фрагмент кода из Accelerated C++, и у меня возникла проблема с завершением цикла while. Код здесь:Завершение цикла while (cin >> s). Ускоренный C++

#include <iostream> 
#include <vector> 

using namespace std; 

istream& read(istream& in, vector<double>& vec) 
{ 
    cout << "start reading" << endl; 
    if (in) { 
     vec.clear(); 
     double x; 
     while (in >> x) { 
      cout << "x=" << x << endl; 
      vec.push_back(x); 
     } 
     in.clear(); 
    } 
    cout << "end reading" << endl; 
    return in; 
} 

int main() { 
    vector<double> vec; 
    read(cin, vec); 
    return 0; 
} 

I вход 1 2 3 4 5 тип EOF (Ctrl-D на MacOS) программа не завершается. Я могу продолжить ввод значений в вектор:

start reading 
1 2 3 4 5 x=1 
x=2 
x=3 
x=4 
x=5 


5 
x=5 
6 
x=6 
7 
x=7 

Ближайший вопрос, который я нашел здесь: http://www.cplusplus.com/forum/beginner/49993/

+1

Оканчивается ли это, когда stdin поступает из файла (как в 'mypog regular

+0

Только что проверено. Да. – desa

+0

Кроме того, есть проблема с вашим кодом: только 'cout' находится внутри цикла while,' vec.push' находится за пределами цикла, хотя отступ указывает, что вы намеревались, чтобы он находился внутри цикла (где должен быть). Используйте фигурные скобки вокруг двух линий. – regular

ответ

1

Ok проблема в том, что в макинтоше я должен сделать следующее: нажмите CTRL-D, чтобы сигнализировать и конец на stdin, а затем клавишу ввода, чтобы вернуть буфер. Подробнее: https://discussions.apple.com/thread/2361809

+0

Возможно, вы захотите упомянуть в своем ответе, что причина в том, что stdin буферизируется по строке: ваша программа получает вход только после завершения строки или буфер полный (очень длинная линия). – regular