2015-01-21 2 views
1

에서로드 할 때 무한 루프로 이어지는 cin.get I (더 큰 응용 프로그램의 일부에 불과하지만 문제는 다음에서 오는 것 같다)에 다음 코드를 가지고 제공 할 때동안 파일

char inputChar; 
while (cin.get(inputChar)){ 
    cout<< inputChar<< "\n"; 
} 

'echo "aaaaa aaaaa"| tst'(위의 프로그램이 tst.out으로 컴파일 된 경우) 프로그램이 올바르게 작동하지만 텍스트 파일을 통해 입력을 제공하면 (예 : './tst mytest.txt') 파일 자체의 내용과 상관없이 커서가 무한 루프 (커서가 다음 줄로 이동하여 다시 프롬프트가 나타나지 않습니다.)로 실행되는 것처럼 보입니다.

왜 이런 일이 벌어지고 있는지, 그리고이 문제를 해결하기 위해 내가 할 수있는 일에 대해 알 수있는 사람이 있습니까?

ps : 유닉스 터미널에서 컴파일하고 실행하고 있습니다.

감사

+0

대화 형 IO는 사용자 입력을 기다리고, 파이프는 EOF를가집니다. 사용자가 EOF를 위해 Ctrl-D를 입력하게하십시오 –

+0

대소 문자를 정확하게 설명하고 있습니까? 'echo "aaaa aaaaa"| tst'는 파이프에서 읽을 것이고'./tst mytest.txt'는 보통 대화 형 입력을 사용합니다. – Angew

+0

파일에서 읽으려면 ifstream 객체를 만들어야합니다. cin 표준 입력에서 읽습니다. – NathanOliver

답변

2

파일 및 cin 입력을 모두 처리하려면 다음을 수행하십시오.

std::ifstream myFile; 

if (argc > 1) 
{ 
    myFile.open(argv[1]); 
} 

if (myFile.is_open()) 
{ 
    readMyInput(myFile); 
    myFile.close(); 
} else 
{ 
    readMyInput(std::cin); 
} 

void readMyInput(std::istream &inputStream) 
{ 
    char myCharacter; 
    while (inputStream.get(myCharacter)) 
    { 
     cout<< myCharacter<< "\n"; 
    } 
} 

파일을 열려고하지 않습니다. cat input.txt | ./tst.outstd::cin 입력 스트림을 제공합니다

+0

만약 내가 줄을 사용한다면 위의 결과는 한 줄에 하나의 줄을 만들어내는 반면 위의 줄은 한 줄에 하나의 문자를 반환하기 때문에 출력 결과는 위의 것과 다를 것이다. – Falo

+0

솔루션을 업데이트했습니다. –

+0

응용 프로그램에서 파일을 읽지 않고 파일의 내용을 응용 프로그램에 전달할 수 있습니까? – Falo

0

이것은 paticularly 좋은 방법이 아닙니다, 더 나은 방법은 거기에 아마,하지만 당신이 시도 할 수 :. 입력 할 수 있습니다 각 문자에 대해

if(cin.get() == "SOME_CHARACTER_CHANGE_THIS") { 
    cout << "SOME_CHARACTER_CHANGE_THIS_ALSO" << endl; 
} 

+1

제공되는 모든 입력을 읽을 수 있도록 프로그램이 필요하므로 가능한 모든 문자에 대해 위의 작업을 수행 할 수 없습니다. – Falo

+0

죄송합니다. 나는 나 자신을 생각하기 시작했다. 내 사과. –

0

예제 코드는 파일에서 읽지 않고 stdin에서 읽습니다. 파일에서 읽으려면 main에 전달 된 파일 이름으로 ifstream을 초기화하고 cin 대신 읽어야합니다.

+0

정확하지 않은 내용의 사과를드립니다. 내가하고 싶은 것은 무한 루프에 빠지지 않고 "./tst mytest.txt"를 실행하여 응용 프로그램을 실행할 수있게하는 것입니다. (필자는 파일의 내용을 읽고 입력 한대로 응용 프로그램에 제공한다는 의미였습니다.) – Falo

관련 문제