2017-01-22 6 views
2

대체 솔루션을 찾는 데 더 많은 관심이있어 제목이 오해의 소지가 있습니다. 내 직감은 버퍼가 비어 있는지 여부를 확인하는 것이 가장 이상적인 솔루션이 아니라는 것입니다 (적어도 내 경우에는).C++ std :: cin 버퍼가 비어 있는지 확인하는 방법

저는 C++을 처음 사용하고 Bjarne Stroustrup의 C++을 사용한 프로그래밍 원리와 실습을 따르고 있습니다. 저는 현재 제 7 장에 있습니다. 우리는 6 장에서 계산기를 "정제"하고 있습니다. 질문의 끝 부분에 소스 코드에 대한 링크를 넣을 것입니다.

기본적으로 계산기는 세미콜론으로 구분 된 사용자 입력

> 5+2; 10*2; 5-1; 
      = 7 
>   = 20 
>   = 4 
> 

하지만 지난 2 개 답변 프롬프트 문자 ('>')의 제거, 그리고 사용자의 입력을 요구하는 경우에만 다시 표시 것입니다. 첫 번째 본능은 버퍼가 비어 있는지 확인하는 방법을 찾고, 그렇다면 문자를 알아 내고 그렇지 않은 경우 대답을 시도하는 것입니다. 그러나 약간의 인터넷 검색 결과 나는 처음에 생각한만큼 쉬운 일이 아니라는 것을 깨달았습니다 ... 그리고 그것은 시작하기에 좋지 않을 수도 있습니다.

본질적으로 제 질문은 여러 입력이있을 때 마지막 두 답변에 '>'문자를 제거하는 방법입니다. 그러나 cin 버퍼 을 확인하는 것이 가능하다면이고 이 아니라이 아닙니다. 결국 나에게 나쁜 생각이 들게됩니다.

소스 코드 : https://gist.github.com/Spicy-Pumpkin/4187856492ccca1a24eaa741d7417675

헤더 파일 : http://www.stroustrup.com/Programming/PPP2code/std_lib_facilities.h

이^당신은이 헤더 파일이 필요합니다. 나는 그것이 저자 자신에 의해 쓰여졌다 고 추정한다.

편집 : 웹에서 몇 가지 해결책을 찾아 보았지만 솔직히 말해서 나에게 어떤 의미가 없었습니다. C++을 선택하고 4 일이 지났기 때문에 프로그래밍에 대한 배경이 매우 희박하기 때문에 때로는 인터넷 검색도 조금 힘들 수 있습니다.

+1

막대기로 찌그러 뜨 렸는지 확인하십시오. –

+1

비슷한 질문 : http://stackoverflow.com/questions/3317740/checking-data-availability-before-calling-stdgetline –

+0

이 경우에는'std :: getline'을 사용하여 한 번에 한 줄씩 읽을 수 있고, 각 줄 이후의 프롬프트 –

답변

1

발견 한 것처럼 이것은 매우 복잡한 작업입니다. 여기에는 C++ 라이브러리와 실제 기본 파일 모두에 여러 가지 문제가 있기 때문입니다. C++ 입력 스트림 ++ 라이브러리

std::cin

C는 중간 버퍼하는 std::streambuf를 사용한다. 기본 파일 또는 대화식 터미널로부터의 입력은 문자 단위로 읽지 않고 가능하면 적당한 크기의 청크로 읽습니다. 의가 있다고 가정 해 봅시다 :

int n; 

std::cin >> n; 

이의는이 작업을 수행하고 위에있을 때, n이 숫자 42를 포함한다고 가정 해 봅시다. 글쎄, 실제로는 std::cin이 '4'와 '2'두 글자 만 읽지는 않았지만 그 이상의 문자는 std::cin 스트림에서 사용할 수있었습니다. 나머지 문자는 std::streambuf에 저장되고, 다음 입력 조작은 실제로 기본 파일을 읽기 전에 읽습니다.

그리고 위의 >>은 실제로 파일에서 아무 것도 읽지 않고 이전 입력 작업 이후에 남아 있던 std::streambuf에서 '4'및 '2'문자를 가져온 것과 같습니다.

밑에있는 std::streambuf을 검사하여 거기에 읽지 않은 것이 있는지 확인할 수 있습니다. 그러나 이것은 당신을 정말로 돕지 않습니다.

위의 >> 연산자를 실행하려는 경우 기본 std::streambuf을 살펴보고 '4'라는 단일 문자가 포함되어 있음을 발견했습니다. 다음 캐릭터가 무엇인지 알아야합니다. std::cin. 공백이나 개행 문자 일 수 있습니다.이 경우 >> 연산자에서 얻는 것이 모두 4 개입니다. 또는 다음 문자가 '2'일 수 있습니다.이 경우 >>은 적어도 '42'이상을 삼키고 더 많은 문자는 ' 자릿수.

이 로직을 모두 직접 구현하고 그 밑에있는 std::streambuf을보고 향후 입력 작업을 만족 시킬지 여부를 결정할 수 있습니다. 축하 : 방금 >> 운영자를 재발 명했습니다. 한 번에 한 문자 씩 입력 내용을 분석 할 수도 있습니다.

당신은 std::cin은 다음의 입력 조작을 만족하기에 충분한 입력이없는 것으로 결정

기본 파일. 이제 std::cin에서 입력 가능 여부를 알아야합니다.

이제 운영 체제 관련 주제가됩니다. 이것은 더 이상 표준 C++ 라이브러리에서 다루지 않습니다.

결론

이 행할 수 있지만, 모든 실제 상황에서, 여기에 최고의 솔루션 대신 C++ 입력 스트림의, 운영 체제 별 접근 방법을 사용하고, 자신을 읽고 입력을 버퍼링하는 것입니다. 예를 들어, Linux에서 fd 0을 비 차단 모드로 설정하여 read()이 차단되지 않도록하고 사용 가능한 입력이 있는지 여부를 확인하려면 단지 read()을 시도하십시오. 뭔가 읽은 경우 나중에 볼 수있는 버퍼에 넣으십시오. 이전에 읽은 버퍼 된 입력을 모두 소비하고 더 많은 입력이 읽힐 때까지 poll() 파일 설명자를 기다려야합니다.