【问题标题】:How to read number of characters stored in input stream buffer如何读取存储在输入流缓冲区中的字符数
【发布时间】:2016-08-17 10:55:58
【问题描述】:

我有一个简单的问题——我怎么可能在控制台窗口中写一些东西给std::cin而不将它分配给stringchar[]?然后如何读取缓冲区中存储的字符数?

假设我想创建一个char 的数组,但它应该具有输入长度的大小。我可能会创建一个缓冲区或一个大尺寸的变量来存储输入,然后读取它的长度,将内存分配给我的 char 数组并复制它。但我们也可以说我是一个纯粹主义者,我不希望使用任何额外的(除了流缓冲区)内存。是否有可能访问std::cin 缓冲区,读取存储的字符数并将它们复制到我的数组中?我试图找到答案几个小时,阅读 cpp 参考,但我真的找不到解决方案。我什至找不到是否有可能在不将其分配给变量的情况下向std::cin 缓冲区写入内容,即执行cin >> variable。如果您对此问题有其他解决方案,我将不胜感激。

另外,有人知道我在哪里可以找到有关缓冲区如何工作的信息(意味着计算机在哪里存储来自键盘的输入、如何处理它以及 iostream 如何与计算机一起工作以从中提取数据)。

非常感谢!

【问题讨论】:

  • "向 std::cin 缓冲区写入内容而不将其分配给变量,也就是执行 cin >> 变量" -- 你的意思是 "read 从 std::cin “?这就是你的“aka”部分所做的。

标签: c++ io iostream


【解决方案1】:

首先,为了填充输入缓冲区,您需要执行某种读取操作。读取操作可能不需要将读取的内容放入变量中。例如,cin.peek() 可能会阻塞,直到用户输入某个值并返回将从缓冲区读取的下一个字符而不提取它,或者您也可以将cin.getcin.putback 一起使用。

然后您可以使用streambuf::in_avail 函数来确定输入缓冲区中有多少字符,包括换行符。

考虑到这一点,您可以这样做:

char ch;
cin.get(ch);//this will block until some data is entered
cin.putback(ch);//put back the character read in the previous operation
streamsize size=cin.rdbuf()->in_avail();//get the number of character in the buffer available for reading(including spaces and new line)
if(size>0)
{
    char* arr=new char[size];//allocate the size of the array(you might want to add one more space for null terminator character)

   for(streamsize i=0;i<size;i++)
        cin.get(arr[i]);//copy each character, including spaces and newline, from the input buffer to the array

   for(streamsize i=0;i<size;i++)
        cout<<arr[i];//display the result
}

话虽如此,我相信您这样做是有特定原因的,但我认为像这样进行 I/O 并不是一个好主意。如果您不想估计输入所需的字符数组的大小,那么您始终可以使用std::string 并改为读取输入。

【讨论】:

  • 好的。所以我复制了该代码并执行了它,但无论我给输入什么,我总是有 size = 0。而且 - 为什么在 cpp 参考中没有提到 istream::peak() 在换行符时停止带来?毕竟,只要没有给出特定字符,就有一些方法可以接受输入。
  • 正如您所说,当流中没有任何内容可读取时,它返回eof,我相信这是标准行为。您可以使用char ch; cin.get(ch); cin.putback(ch); 进行尝试,这将在您调用in_avail 之前从输入中读取第一个字符并将其放回流中。我已经修改了答案。这两种方法都适用于我的平台。
  • @zuroslav 还有一件事,还有输入函数可以返回(获取)任何输入给他们,比如cin.get()。因此cin.peek() 很可能不会在返回之前等待给出特定字符,它只是从输入流中读取下一个字符,无论可能包含新行的字符,而不提取它并返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多