C++ 从重定向的标准输入获取输入时使用seekg()
因此,我尝试使用cin.get()读取字符串两次。输入被重定向为“程序<输入”。因此,使用seekg()是有效的 正如titel所说,我想我可以使用seekg()保存字符串的起始位置,这样我就可以再次使用同一字符串的起始位置 以下是我的尝试:C++ 从重定向的标准输入获取输入时使用seekg(),c++,seekg,C++,Seekg,因此,我尝试使用cin.get()读取字符串两次。输入被重定向为“程序
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。有人能告诉我我做错了什么吗
谢谢你的帮助 您不能在流/管道上搜索。它们不会继续存在于记忆中。假设键盘直接连接到您的程序。你能用键盘做的唯一操作就是请求更多的输入。它没有历史 如果它只是一个无法搜索的键盘,但如果它被重定向为<在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";
}
#包括
int main(){
标准::cin.seekg(1,标准::ios::beg);
if(std::cin.fail())
std::cout您无法在流/管道上搜索。它们不会继续存在于内存中。想象一下键盘直接连接到您的程序。您可以对键盘执行的唯一操作是请求更多输入。它没有历史记录
如果它只是一个无法搜索的键盘,但如果它被重定向为<在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";
}
#包括
int main(){
标准::cin.seekg(1,标准::ios::beg);
if(std::cin.fail())
std::cout您不能在流上搜索。您必须取消字符设置。您不能在流上搜索。您必须取消字符设置。您不能这样做。std::cin通常连接到终端,因此不可能进行随机访问
如果您使用的流是std::istringstream或std::ifstream,则可以这样做
我的建议是将std::cin中的所有字符读入单个std::字符串,然后从该字符串创建一个std::istringstream,然后在该std::istringstream而不是std::cin上尝试您的技术。您不能这样做。std::cin通常连接到终端,因此不可能进行随机访问
如果您使用的流是std::istringstream或std::ifstream,则可以这样做
我的建议是将std::cin中的所有字符读入单个std::字符串,然后从该字符串创建一个std::istringstream,然后在该std::istringstream而不是std::cin上尝试您的技术。您不能在流上搜索,但可以使用std::cin.peek()
或std::cin.unget()
1) 通过使用cin.peek()
2) 通过使用cin.unget()
您不能在流上搜索,但可以使用std::cin.peek()
或std::cin.unget()
1) 通过使用cin.peek()
2) 通过使用cin.unget()
嗯,这很奇怪,因为我的作业规范要求我们从标准输入中获取输入。我的教授说,为了对输入进行两次传递,我们需要使用seekg()…可能我误解了指导原则。如果我使用输入修正,比如“programchar c;
while (cin.get(c))
{
//do stuff
}
cin.unget();
while (cin.get(c))
{
//do stuff with the string a second time
}