2015-10-16 3 views
0

Так что я пытаюсь либоКак ожидать ввода от переназначения и пользовательского ввода

а) позволяет пользователю ввести строку, пока они не введите EXIT

или

б) перенаправлять файл со стандартного вход (a.out < test.txt) до в конце файла, а затем прекратить

Моей попытки коды:

#include <iostream> 
#include <string> 
#include <cstdlib> 

using namespace std; 

int main(){ 

    string input = ""; 
    while(true){ 
     cout << "Enter string: "; 
     while(getline(cin, input)){ 
     if(input == "exit" || cin.eof()) goto end; 
     cout << input << "\n"; 
     cout << "Enter string: ";      
    } 

    } 
    end: 
    return 0; 



} 

Это вызывает проблемы с перенаправлением, когда я использую команду a.out < test.txt я получаю бесконечный цикл (где test.txt содержит одну строку «Привет»)

вход пользователя кажется, работает хорошо

Я использую GetLine потому что в реальной программе мне нужно прочитать файл построчно, а затем манипулировать линии, прежде чем перейти к следующей строке файла

EDIT: Мой вопрос, как я могу прекратить этот цикл составляет как ввод и перенаправление пользователя?

+0

Ваш код работает на меня https://ideone.com/pj0xID – Hawkings

ответ

1
#include <iostream> 
#include <string> 
#include <cstdlib> 

using namespace std; 

int main(){ 
    string input = ""; 
    while(cin && cout<<"Enter string: " && getline(cin, input)){ 
    //check both cout and cin are OK with the side effect of 
    // writing "Enter string" and reading a line 

    if(input == "exit") return 0; //no need for a goto 
    cout << input << "\n"; 
    } 
    if(cin.eof()) return 0; //ended because of EOF 
    return 1; //otherwise, the loop must have broken because of an error 
} 

Держите его просто. Вам не нужен внешний цикл, и cin.eof() никогда не будет истинным внутри блока while, потому что если cin.eof() истинно, то выражение getline, которое возвращает cin, которое преобразует в bool, преобразуется в false, тем самым заканчивая цикл.

Петля заканчивается, если cin встречается с EOF или с ошибкой.

+0

спасибо! это имеет большой смысл. –

1

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

int main(){ 
bool flag = true; 

string input = ""; 
while(flag){ 
    cout << "Enter string: "; 
    while(getline(cin, input)){ 
     if(input == "exit" || cin.eof()) { 
      flag = false; 
      break; 
     } 
     cout << input << "\n"; 
     cout << "Enter string: "; 
    } 

    } 


return 0; 
}