2010-08-30 82 views
0

有沒有辦法在讀取升壓存檔後檢測升壓存檔內是否有任何內容?我試過這段代碼:如何檢測升壓存檔內是否有任何內容

const string s1("some text"); 
std::stringstream stream; 
boost::archive::polymorphic_text_oarchive oAr(stream); 
oAr << s1; 

boost::archive::polymorphic_text_iarchive iAr(stream); 
string s2; 
iAr >> s2; 

if (!stream.eof()) 
{ 
    // There is still something inside the archive 
} 

我預期的那樣,如果我直接從它讀取流對象進行更新,但是在上面的代碼stream.eof()總是false雖然我讀我寫的一切。將字符串更改爲int給出了相同的結果。

我想這纔是對的情況下,當我讀到不是我寫的同種原因:

const string s1("some text"); 
std::stringstream stream; 
boost::archive::polymorphic_text_oarchive oAr(stream); 
oAr << s1; 

boost::archive::polymorphic_text_iarchive iAr(stream); 
int s2; 
iAr >> s2; // string was written but int is read 

我知道,沒有多少,我可以在這種情況下做的,但我希望在至少檢查一下我讀的所有東西都會給我一些指示,說明讀寫之間是否存在一些不一致。有任何想法嗎?

+1

嘗試:'if(stream.peek(),!stream.eof())'。直到您嘗試閱讀某些內容時,標誌纔會被設置。 – GManNickG 2010-08-30 08:28:46

+0

@GMan,我認爲應該發佈爲答案:) – FireAphis 2010-08-30 09:11:37

回答

2

當您試圖在文件結束後讀取某些內容時,可能會設置stream.eof(),而不是當您從中讀取最後一個字節時。

在流中啓用異常並嘗試讀取,直到引發異常爲止。

2

只有嘗試了某些操作後,流才能設置任何標誌。

您可以使用peek()來查看並返回,但不能刪除流中的下一個字符。這足以設置一個標誌,所以:if (stream.peek(), !stream.eof()) /* peek was not eof */