先看看出问题的代码片段
std::string szFileName = dir + "/SymPS.tab";
std::ifstream is;
is.open(szFileName.data(),ios_base::in);
if(!is.is_open())
return false;
std::string message;
while(!is.eof())
{
std::getline(is, message);
if(message[0] == '\0') continue;
if(message[0]=='*')
continue;
}
is.seekg(0, ios::beg);
while(!is.eof())
{
std::getline(is, message);
...
}
运行过程中会发现,即使中间有is.seekg(0,ios::beg)这句话想把输入流定位到流的开始位置,但是,根本没有起作用,在下面的is.eof()判断那里,is.eof()还是返回了true。
后来查阅资料后才知道,原来前面的while循环while(!is.eof())执行完以后,is的eof标记就是true了,这时调用seekg是没用的。
解决方法:在seekg之前需要调用流对象的clear方法,把流的标记清除掉,清除以后就可以正常调用seekg方法了。
std::string szFileName = dir + "/SymPS.tab";
std::ifstream is;
is.open(szFileName.data(),ios_base::in);
if(!is.is_open())
return false;
std::string message;
while(!is.eof())
{
std::getline(is, message);
if(message[0] == '\0') continue;
if(message[0]=='*')
continue;
}
is.clear();
is.seekg(0, ios::beg);
while(!is.eof())
{
std::getline(is, message);
...
}