我正在尝试从库中读取一些满足特定条件的字符,stdin
同时iostream
将那些不满足条件的字符留在其中,stdin
以便以后可以读取那些跳过的字符。可能吗?
例如,我a-c
只想要字符,输入流是abdddcxa
.
首先读入a-c - abca
;中的所有字符 此输入完成后,开始读取剩余字符dddx
。(这两个输入不能同时发生。它们可能具有两个不同的功能)。
我正在尝试从库中读取一些满足特定条件的字符,stdin
同时iostream
将那些不满足条件的字符留在其中,stdin
以便以后可以读取那些跳过的字符。可能吗?
例如,我a-c
只想要字符,输入流是abdddcxa
.
首先读入a-c - abca
;中的所有字符 此输入完成后,开始读取剩余字符dddx
。(这两个输入不能同时发生。它们可能具有两个不同的功能)。
阅读所有内容,然后将输入分成您需要的两部分,最后将每个部分发送到需要处理它的函数,这不是更简单吗?
将数据保存在标准输入缓冲区中类似于使用全局变量,它会使您的程序更难理解,并且在您处理它时,其他代码(或用户)会更改缓冲区中的内容。
另一方面,将您的程序划分为“读取数据的部分”、“解析数据并划分工作量的部分”和“完成工作的部分”可以使程序结构更好,易于理解和测试。
您可能可以使用regex
来进行实际拆分。
您要的是 putback 方法(有关更多详细信息,请参阅:http ://www.cplusplus.com/reference/istream/istream/putback/ )。您必须阅读所有内容,过滤您不想保留的部分,然后将其放回流中。例如:
cin >> myString;
// Do stuff to fill putbackBuf[] with characters in reverse order to be put back
pPutbackBuf = &putbackBuf[0];
do{
cin.putback(*(pPutbackBuf++));
while(*pPutbackBuf);
另一种解决方案(这不是您所要求的)是将输入拆分为两个字符串,然后将“未输入”字符串输入字符串流并将其传递给需要对其余部分执行某些操作的任何函数那些角色。
你想做的事情一般是不可能的;ungetc
并且putback
存在,但不能保证它们适用于多个角色。他们实际上并没有改变标准输入;他们只是推回输入缓冲区。
相反,您可以做的是通过将输入读入字符串并处理该字符串来显式保留自己的缓冲区。但是,在许多情况下,流不会让您安全地倒带。
不,流无法进行随机访问(fstream 和字符串流除外)。您将必须阅读整行/输入并处理生成的字符串(但是,std::stringstream
如果您认为它是最好的工具,您可以使用 iostreams/ 来执行此操作——我不这么认为,但 iostreams 专家可能会有所不同)。