输入缓冲如何在C ++中工作

时间:2013-05-24 10:23:27

标签: c++ inputstream input-buffer

这是一段代码段。我对内部缓冲的工作方式感到困惑。

  while(true)
  {
      cout << "Enter a character: ";
      cin.ignore(3, '\n');
      ch = cin.get();  // ch is char type
      cout << "char: ch: " << ch << endl;
  }

实际上cin.ignore(3, '\n')会忽略前三个字符然后获得下一个直接字符。直到这一点,它的罚款。因为,我将其保留在while循环中,我试图检查ignore()get()的行为。例如,我检查的输出是

Enter a character: abcd
char: ch: d
Enter a character: efgh
char: ch: e
Enter a character: ijkl
char: ch: i
Enter a character: mnopq
char: ch: m
Enter a character: char: ch: q
Enter a character: 

只是为了检查缓冲,故意我给了4个字符而不是1.在第一种情况下,它很好并得到它。从第二点开始,忽略似乎不起作用。当我输入5个字符时,我没有得到这个行为。

需要对此进行解释。 :)

2 个答案:

答案 0 :(得分:3)

根据std :: cin.ignore的文档(streamsize n = 1,int delim = EOF):

  

从输入序列中提取字符并丢弃它们,直到提取了n个字符,或者一个比较等于delim。   http://www.cplusplus.com/reference/istream/istream/ignore/

您将abcd\n置于stdin上。您的第一个ignore(3,'\n')移除了abc,而您的get()移除了d\n仍留在缓冲区中。

然后将efgh\n添加到现在包含\nefgh\n的缓冲区。你的下一个ignore()会读取 3个字符或换行符,无论先发生什么。由于您的换行符是缓冲区中的第一个,因此只会忽略换行符。

您可能希望在请求更多输入之前清空stdin缓冲区。您可以通过修改get()调用或在请求更多输入之前添加第二个ignore()调用来实现此目的。

答案 1 :(得分:2)

cin.ignore(3, '\n')忽略最多三个字符,在找到一行(即\n字符)后停止。

在第一行输入后,缓冲区将包含5个字符abcd\n。因此ignore忽略abcget获取d,留下\n

在第二行之后,它包含\nefgh\n。因此,ignore只会忽略行尾字符,get会返回e

如果要在提取字符后丢弃剩下的行,请再次使用ignore

cin.ignore(numeric_limits<streamsize>::max(), '\n');