2013-09-22 2 views
0

Java 리소스를 기초로 무언가를 배우려고합니다.이를 C++에 적용하고 싶습니다. 자바의Java StdIn.isEmpty()에 해당하는 C++은 무엇입니까

소스가 있습니다

C에서
while(!StdIn.isEmpty()) 
{ 
    //Take input from standard input, and process it... 
} 

++ 내가 가지고 올 수있는 가장 가까운 솔루션은 그러나

while(cin >> someString) 
{ 
    //process someString... 
} 

했다, 문제는, 개체의 CIN 반환 상태가. 잘못된 입력을 std :: string에 넣을 수는 없습니다. 이것은 int에서는 작동하지만 string에서는 작동하지 않을 수 있습니다. 동등한 기능 또는 문제 해결 방법?

미리 감사드립니다.

+0

물론 가능합니다. EOF를 입력하십시오. – chris

+0

적어도 나에게 당신이하려는 일은 분명하지 않다. –

+2

표준 Java API에는'StdIn' 클래스가 없습니다. 너 뭐하려고? – Joni

답변

2

C++ IOSTREAMS으로, 또한 C의 표준 입출력과 함께, 당신이 말할 수없는 파일 여부를 당신이 그것을에서 읽기 시도한다면 비어 있습니다 (예 : std::cin/stdin가 등). 알아내는 유일한 방법은 이며 파일에서 실제로 읽은 파일은입니다. 다음 시도가 성공했는지 확인하십시오.

(예, peek의 형태를 사용할 수 있지만 그와 같은 관용적 또는 실제 어디에도 없습니다.)

그래서 C++의 표준 방법은 한 번에 입력의 전체 라인을 처리, 다음과 같습니다

사용자가 입력 한 선에서의 추출에 성공한 경우
for (std::string line; std::getline(std::cin, line);) 
{ 
    // process "line" 
} 

루프 본문 만 을 실행할 것이다. 입력에 데이터가 없으면 루프 조건이 더 이상 충족되지 않습니다 (즉, 스트림이 더 이상 양호하지 않음). 그러면 루프가 중지됩니다.

같은 생각뿐만 아니라 포맷되지 않은 std::istream::read()fread에, C의 fgets에 적용 및 POSIX의 read(2) 같은 플랫폼 별 기능 : 다음, 입력을 얻기 위해 시도 항상 당신 당신이 어떤 입력을 가지고 있는지 확인, 그리고 당신이 한 경우에만 당신은 입력을 소비하기 시작합니다.

+0

안녕하세요, Kerrek, 답장을 보내 주셔서 감사합니다. 코드가 작동 할 확신합니까? 나를 위해 (GCC 4.8.1) 그것은 항상 작동합니다. Enter 키를 누르면 여전히 계속됩니다 (문자열이 비어 있고 유효한 것처럼 보입니다). 아니면 내가이 모든 잘못을 개념으로 생각하니? – MatthewRock

+0

@MatthewRock : "표준 입력"이 무엇인지에 대한 오해. Enter는 단지 새로운 행을 작성하고 표준 입력을 닫지 않습니다. 독자는 단지 차단하고 더 기다리고 있습니다. 표준 입력을 닫으려면 Ctrl-D를 누르거나 콘솔에서 읽지 말고 리다이렉션과 같은 다른 작업을해야합니다 :'echo "abc"|/a.out' –

+0

좋습니다. 다음 주셔서 감사합니다. 이것이 옵션 일까 두려웠습니다. – MatthewRock

관련 문제