gpt4 book ai didi

c++ - basic_istream::seekg() 似乎不起作用

转载 作者:行者123 更新时间:2023-11-28 04:39:54 26 4
gpt4 key购买 nike

下面的程序应该输出如下内容:

Begin found
space found
End found

但事实并非如此。

#include <sstream>
#include <istream>
#include <string>
#include <cctype>
#include <iostream>

bool Match(std::istream& stream, const std::string& str)
{
std::istream::pos_type cursorPos = stream.tellg();

std::string readStr(str.size(),'\0');

stream.read(&readStr[0],str.size());
stream.seekg(cursorPos);
if(std::size_t(stream.gcount()) < str.size() || readStr != str)
return false;

return true;
}

bool Take(std::istream& stream, const std::string& str)
{
if(!Match(stream,str))
return false;

for(std::string::size_type i = 0; i < str.size(); ++i)
stream.get();

return true;
}

int main()
{
std::string testFile = "BEGIN END";

std::stringstream ss(testFile);
auto c = ss.peek();
while(!ss.eof() && ss.tellg() != -1)
{
if(Take(ss,"BEGIN"))
std::cout << "Begin found" << std::endl;
else if(Take(ss,"END"))
std::cout << "End found" << std::endl;
else if(std::isspace(c))
{
ss.get();
std::cout << "space found" << std::endl;
}
else
std::cout << "Something else found" << std::endl;
}

return 0;
}

我注意到它输出

Begin found
Something else found

当我单步执行调试器时,似乎当我遇到空格字符时,它首先检查是否有 Match()"BEGIN" ,它通过 tellg() 检索光标位置,其值为 5。但是当它预期失败然后用 "END" 检查 Match() 时,光标位于 -1,即结束.

看来 seekg() 调用没有工作,或者我没有正确使用它。

最佳答案

当您的程序进入主循环时,它首先以输入流和“BEGIN”作为参数执行take。 Match 返回 true,get 被调用 5 次,因为那是 BEGIN 的长度。

然后它再次经历循环。它再次调用匹配。此时pos为5,BEGIN的长度。它尝试读取 len(BEGIN) 个字符,但您的 stringstream 没有那么多字符,因此它在位置 -1 处离开循环,并设置错误标志。

因为流是错误状态,下面的 seekg 调用没有预期的效果,解释了你的程序的行为。

关于c++ - basic_istream::seekg() 似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50464784/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com