从重定向的stdin获取输入时使用seekg()

时间:2012-08-01 18:57:03

标签: c++ seekg

所以我试图用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。有人能告诉我我做错了什么吗?

感谢您的帮助!

4 个答案:

答案 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
}