所以我试图用cin.get()两次读取一串字符。输入被重定向为“程序<输入”。所以使用seekg()是有效的。
正如标题所说,我以为我可以使用seekg()来保存字符串的起始位置,所以我可以回来再次使用相同字符串的起始位置。
这是我的尝试:
char c;
while (cin.get(c))
{
//do stuff
}
cin.seekg(0, ios::beg);
while (cin.get(c))
{
//do stuff with the string a second time
}
第二个while循环没有做任何事情,所以我显然没有正确使用seekg。有人能告诉我我做错了什么吗?
感谢您的帮助!
答案 0 :(得分:5)
你不能在溪流/管道上寻找。它们不会继续存在于记忆中。想象一下,键盘直接连接到您的程序。您可以使用键盘进行的唯一操作是要求更多输入。它没有历史。
如果它只是一个键盘,你无法寻找,但如果它被重定向到<在shell寻求工作正常:
#include <iostream>
int main() {
std::cin.seekg(1, std::ios::beg);
if (std::cin.fail())
std::cout << "Failed to seek\n";
std::cin.seekg(0, std::ios::beg);
if (std::cin.fail())
std::cout << "Failed to seek\n";
if (!std::cin.fail())
std::cout << "OK\n";
}
都给:
user @ host:/ tmp&gt; ./a.out
无法寻求 无法寻求 user @ host:/ tmp&gt; ./a.out< test.cc
行
答案 1 :(得分:4)
你做不到。 std :: cin通常连接到终端,因此随机访问是不可能的。
如果您使用的流是std :: istringstream或std :: ifstream,则可以这样做。
我的建议是将std :: cin中的所有字符读入单个std :: string,然后从该字符串创建一个std :: istringstream,然后在std :: istringstream而不是std上尝试你的技术: :CIN
答案 2 :(得分:0)
你不能在溪流上寻找。你必须取消角色。
答案 3 :(得分:0)
您无法在溪流上搜索,但可以使用std::cin.peek()
或std::cin.unget()
。
1)使用cin.peek()
char c;
while (c = cin.peek())
{
//do stuff
}
while (cin.get(c))
{
//do stuff with the string a second time
}
2)使用cin.unget()
char c;
while (cin.get(c))
{
//do stuff
}
cin.unget();
while (cin.get(c))
{
//do stuff with the string a second time
}