如何读取存储在输入流缓冲区中的字符数
How to read number of characters stored in input stream buffer
>我有一个快速的问题 - 如何在控制台窗口中编写一些东西来std::cin
而不将其分配给string
或char[]
?然后如何读取缓冲区中存储的字符数?
假设我想创建一个char
数组,但它的大小应为输入长度。我可能会创建一个缓冲区或大变量来存储输入,然后读取其长度,为我的 char 数组分配内存并复制它。但我们也说我是一个纯粹主义者,我不想使用任何额外的(除了流缓冲区)内存。是否可以访问缓冲区std::cin
读取存储的字符数并将它们复制到我的数组中?我试图找到几个小时的答案,阅读 cpp 参考,但我真的找不到解决方案。我什至找不到是否有可能在不将其分配给变量的情况下向缓冲区写入std::cin
内容,也就是执行cin >> variable
。如果您对此问题有替代解决方案,我将不胜感激任何帮助。
另外,有没有人知道我在哪里可以找到有关缓冲区如何工作的信息(意味着计算机存储来自键盘的输入的位置,如何处理以及iostream如何与计算机一起工作以从中提取数据)。
非常感谢!
首先,为了填充输入缓冲区,您需要执行某种读取操作。读取操作可能不需要将读取的内容放入变量中。例如,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
并读取输入。
- 如何忽略输入流中的某些字符?
- C++输入流.与 cin unget() 函数有点混淆
- 从输入流中读取行,并能够跳过块
- 使用 Visual Studio 代码读取 C++ 中的输入流时出错
- 处理输入流运算符>>中的无效输入
- 树莓派上的端口音频,找不到输入流的设备
- 如何将C++输入流分隔符包含在结果令牌中
- 如果两个输入流相等,我如何构造主()到输出是
- 使用非成员函数从输入流中提取类对象
- CIN是否将输入流中的无效字符取用
- 动态内存分配和输入(流)运算符C++
- 计算输入流中值的出现次数
- (C++) 学习向量 - 编码/输入流终止/比较向量的问题
- 为什么输入流无法识别 Ctrl D 并给出无限循环
- java 输入流,字节大,然后是 127
- 检查是否为输入流设置了Skipws/noskipws标志
- 从Portaudio到WebRTC :: AudioProcessing馈送输入流
- std::setfill 和 std::setw 用于输入流?
- 从缓冲区输入的位
- 如何读取存储在输入流缓冲区中的字符数