如何读取存储在输入流缓冲区

时间:2016-04-23 22:12:12

标签: c++ io iostream

我有一个简单的问题 - 如何在std::cin的控制台窗口中写一些内容而不将其分配给stringchar[]?然后如何读取存储在缓冲区中的字符数?

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

另外,有人知道在哪里可以找到有关缓冲区如何工作的信息(指计算机存储键盘输入的位置,处理方式以及iostream如何与计算机一起工作以从中提取数据)。

非常感谢!

1 个答案:

答案 0 :(得分:2)

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

然后,您可以使用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并阅读输入。