Следующая программа должна вывести что-то вроде:
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
.Но затем, когда он неожиданно завершается с ошибкой, а затем проверяет Match()
с "END"
, курсор находится на -1
, то есть в конце.
Таким образом, кажется, что вызов seekg()
не работаетили я не правильно его использую.