1

因此,我尝试使用 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

4 回答 4

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 > ./a.out寻找失败
寻找
失败
user@host:/tmp > ./a.out < test.cc
OK

于 2012-08-01T18:59:58.543 回答
4

你不能那样做。std::cin 通常连接到终端,因此随机访问是不可能的。

如果您使用的流是 std::istringstream 或 std::ifstream,则可以这样做。

我的建议是将 std::cin 中的所有字符读入单个 std::string,然后从该字符串创建一个 std::istringstream,然后在该 std::istringstream 而不是 std::cin 上尝试您的技术。

于 2012-08-01T19:04:16.463 回答
0

你不能在流上寻找。你必须取消字符。

于 2012-08-01T19:00:07.440 回答
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
}
于 2016-06-20T12:44:23.927 回答