Cin 버퍼를 어떻게 플러시합니까?


답변:


101

혹시:

std::cin.ignore(INT_MAX);

이것은 읽히고까지 모든 것을 무시 EOF합니다. (또한 읽을 문자 인 두 번째 인수를 제공 할 수도 있습니다 (예 : '\n'한 줄 무시).

또한 :이 작업 std::cin.clear();전에 스트림 상태를 재설정하기 위해 a :를 수행 할 수도 있습니다.


10
(이전 내가 아는) 이전에 지우기보다는 스트림이 버퍼에서 작동 할 수있는 좋은 상태가됩니다.
GManNickG 2010 년

고마워, GMan! 먼저 잘못된 방법을 사용하고 내 실수를 찾는 데 상당한 시간을 보냈습니다.
balu

@GManNickG, 방금 답변을 수정했습니다.
bwDraco

@DragonLord : 내가 돌이켜 보았어야했던 명백한 해결책, 감사합니다. :)
GManNickG

3
제 경우에 '\ n'이 필요하다는 점을 지적하고 싶었습니다. 그렇지 않으면 후속 "cin >>"이 작동하지 않습니다.
Cardin 2013

114

C 버전보다 C ++ 크기 제약 조건을 선호합니다.

// Ignore to the end of file
cin.ignore(std::numeric_limits<std::streamsize>::max())

// Ignore to the end of line
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')

15
더 중요한 것은 값이 다를 수 있다는 것입니다! (스트림 크기는 정수일 필요 없음)

2
cin위의 첫 번째 명령문을 사용하여 cin버퍼 를 플러시 하면를 EOF눌러 입력 할 때까지 계속 입력을 요청하기 때문에 파일 끝까지 무시해야하는 예를 인용 해 주 ctrl+d시겠습니까?
ajay

@ajay : 아니요. 결정해야 할 사항입니다. 위의 내용이 무엇인지 설명하는 것입니다.
Martin York

23
cin.clear();
fflush(stdin);

이것은 콘솔에서 읽을 때 나를 위해 일한 유일한 것입니다. 다른 모든 경우에는 \ n 부족으로 인해 무기한으로 읽거나 버퍼에 무언가가 남아 있습니다.

편집 : 이전 솔루션이 상황을 악화 시켰다는 것을 알았습니다. 그러나 이것은 작동합니다.

cin.getline(temp, STRLEN);
if (cin.fail()) {
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

13

이에 대한 두 가지 해결책을 찾았습니다.

첫 번째이자 가장 간단한 방법은 다음과 같이 사용하는 것 std::getline()입니다.

std::getline(std::cin, yourString);

... 개행에 도달하면 입력 스트림을 버립니다. 이 기능에 대한 자세한 내용은 여기를 참조하십시오 .

스트림을 직접 버리는 또 다른 옵션은 다음과 같습니다.

#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');

행운을 빕니다!


9
int i;
  cout << "Please enter an integer value: ";

  // cin >> i; leaves '\n' among possible other junk in the buffer. 
  // '\n' also happens to be the default delim character for getline() below.
  cin >> i; 
  if (cin.fail()) 
  {
    cout << "\ncin failed - substituting: i=1;\n\n";
    i = 1;
  }
  cin.clear(); cin.ignore(INT_MAX,'\n'); 

  cout << "The value you entered is: " << i << " and its double is " << i*2 << ".\n\n";

  string myString;
  cout << "What's your full name? (spaces inclded) \n";
  getline (cin, myString);
  cout << "\nHello '" << myString << "'.\n\n\n";


4

나는 선호한다:

cin.clear();
fflush(stdin);

cin.ignore가 그것을 자르지 않는 예가 있지만 지금은 생각할 수 없습니다. (Mingw와 함께) 그것을 사용해야 할 때가 얼마 전이었습니다.

그러나 fflush (stdin)는 표준에 따라 정의되지 않은 동작입니다. fflush ()는 출력 스트림만을 의미합니다. fflush (stdin) 은 C 표준에 대한 확장으로서 Windows (적어도 GCC 및 MS 컴파일러 포함)에서 예상대로 작동하는 것 같습니다 .

따라서이를 사용하면 코드를 이식 할 수 없습니다.

fflush (stdin) 사용을 참조하십시오 .

또한 대안 은 http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 을 참조하십시오 .


9
fflush (stdin); 정의되지 않은 동작 (C 프로그래밍 언어)이며 7.18.5.2/2에 명시 적으로 명시되어 있습니다.
Cubbi

1
유효한 kludge를 제공하면 +1. 어떤 사람들은 직업이 있고 다른 사람들은 표준이 있습니다.
Mikhail

5
@Mikhail : 작업에는 표준 준수 코드 작성이 포함되어야합니다. 앞으로 작성한 내용은 사용하지 않도록하겠습니다.
Ed S.

4

또 다른 가능한 (수동) 솔루션은

cin.clear();
while (cin.get() != '\n') 
{
    continue;
}

CLion과 함께 fflush 또는 cin.flush ()를 사용할 수 없으므로 편리했습니다.


나를 위해 무한 루프.
StarWind0

라인의 끝이있는 경우에만 작동합니다. 그렇지 않으면 무한 루프
Bobul Mentol 2016 년

2

가장 쉬운 방법:

cin.seekg(0,ios::end);
cin.clear();

stdin 스트림의 끝에 cin 포인터를 배치하고 cin.clear ()는 EOF 플래그와 같은 모든 오류 플래그를 지 웁니다.


1

다음이 작동합니다.

cin.flush();

일부 시스템에서는 사용할 수 없으며 다음을 사용할 수 있습니다.

cin.ignore(INT_MAX);

1
EOF (두 번째 매개 변수의 기본값)에 도달 할 때까지 읽은 INT_MAX 문자를 무시할 수 있는데 루프를 수동으로 작성하는 이유.
Evan Teran

Gunnar, 혹시라도이를 반영하도록 게시물을 편집하는 것이 더 나을 수 있습니다.
Dana the Sane

1
내가 알 수있는 한, flush메소드는 출력 전용이며 이미 작성된 문자를 처리합니다.
Marc van Leeuwen

cin.flush () :basic_istream<char>' has no member named 'flush'
eric

1
#include <stdio_ext.h>

그런 다음 기능을 사용하십시오.

__fpurge(stdin)

0

cin.get() 자동으로 충분히 이상하게 플러시하는 것 같습니다 (혼란스럽고 변덕 스러울 수 있기 때문에 선호하지 않을 것입니다).


0

그것은 나를 위해 일했습니다. getline ()과 함께 for 루프를 사용했습니다.

cin.ignore()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.