2016-04-23 161 views
2

我有一个快速的问题 - 我怎么可能写在控制台窗口std::cin没有分配给stringchar[]?然后如何读取存储在缓冲区中的字符数?如何读取输入流缓冲区中存储的字符数

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

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

非常感谢!

+0

“将某些内容写入std :: cin缓冲区而不将其指定给变量,又名执行cin >>变量” - 是否指“** read ** from std :: cin”?这就是你的“aka”部分所做的。 – Cubbi

回答

1

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

+0

好的。所以我复制了这段代码并执行了它,但无论我给了什么输入,我总是有size = 0。还有 - 为什么在cpp引用中没有提到istream :: peak()在新行字符是带来了什么?毕竟,只要没有给出特定字符,就有输入方法。 – zuroslav

+0

正如你所说的那样,当没有什么要从流中读取时它会返回'eof',我相信这是标准行为。你可以用'char ch; cin.get(CH); cin.putback(ch);',这将读取输入中的第一个字符,并在调用'in_avail'之前将其放回流中。我修改了答案。这两种方法都适用于我的平台。 –

+0

@zuroslav另外还有一个输入函数,它返回(获取)给它们的任何输入,比如'cin.get()'。所以'cin.peek()'在返回之前不会等待一个特定的字符,它只是从输入流中读取下一个字符,不管是否包含新行的字符,都不会提取并返回。 –

相关问题