1. 程式人生 > >seekg(0,ios::beg)不起作用的原因和解決方法

seekg(0,ios::beg)不起作用的原因和解決方法

先看看出問題的程式碼片段

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);
                ...
        }