2016-03-09 29 views
0

我試圖用ifstream和所有try和catch方法打開一個文件。我想測試閱讀功能。而Im試圖讀取更多的文件長度即時獲取異常。但是,錯誤按摩:閱讀功能失敗時的成功消息

Error:basic_ios::clear: Success 

我的代碼:

void OpenFile(char* raw_slice) throw(std::ios_base::failure, std::string) { 

     ifstream init; 
     init.exceptions(ifstream::failbit | ifstream::badbit | ifstream::eofbit); 
     try { 
      init.open("/home/path/file", ios_base::in | ios_base::binary); 
     }catch(const ifstream::failure &e) { 
      cerr << "Error:" << e.what() << ": " << strerror(errno) << endl; 
      throw; 
     } 
     try { 
      init.read((char*)raw_slice, 1000); //out of bound of source file 
     }catch (const ifstream::failure &e){ 
      cerr << "Error:" << e.what() << ": " << strerror(errno) << endl; 
     throw; 
     } 
     try{ 
      init.close(); 
     }catch(const ifstream::failure &e){ 
      cerr << "Error:"<< e.what() << ": " << strerror(errno) << endl; 
      throw; 
     } 
    } 

int main() 
{ 
    char* buf = new char[72]; 
    try{ 
     OpenFile(buf); 
    }catch (const ifstream::failure &e){ 
     cerr << "Error in main:" << e.what() << ": " << strerror(errno) << endl; 
     delete[] buf; 
     return 0; 
    }catch (const string &e) { 
     cerr << "Error in main:: " << e << endl; 
     delete[] buf; 
     return 0; 
    ``} 
    delete[] buf; 
    return 1; 
} 

任何想法,爲什麼?我一直在尋找閱讀功能的返回值,並找不到這種行爲的答案。

回答

2

我覺得ifstream::read沒有設置errno的值。如果讀取的字節數超過可用字節數,則只讀設置failbiteofbit。您應該使用rdstate來獲取這兩位的值而不是errno


更新

檢查failbiteofbit設置你比較它們rdstate()返回值

if ((init.rdstate() & std::ifstream::failbit) != 0 && (init.rdstate() & std::ifstream::eofbit) != 0) 
    cerr << "Error: reached end of file before reading all required bytes\n"; 
+0

但什麼號碼意味着EOF位? – raptor0102

+0

您通常不檢查實際值,您將rdstate的返回值與要檢查的位進行比較。 http://www.cplusplus.com/reference/ios/ios/rdstate/ – Thesane

2

代碼有錯誤:init.read((字符* )raw_slice,1000);需要一個1000字節的緩衝區,但是您傳遞的是使用char * buf = new char [72]創建的72字節緩衝區;

當ifstream :: read嘗試讀取一個72字節緩衝區中的1000字節時拋出一個異常而不處理ifstream :: read,它只是返回「成功」(內部ifstream :: read必須在在begining變量)

我建議你這種方法:

void OpenFile(char* raw_slice, int buffer_size) throw(std::ios_base::failure, std::string) { 

    ifstream init; 
    init.exceptions(ifstream::failbit | ifstream::badbit | ifstream::eofbit); 
    try { 
     init.open("/home/path/file", ios_base::in | ios_base::binary); 
    }catch(const ifstream::failure &e) { 
     cerr << "Error:" << e.what() << ": " << strerror(errno) << endl; 
     throw; 
    } 
    try { 
     init.read((char*)raw_slice, buffer_size); //out of bound of source file 
    }catch (const ifstream::failure &e){ 
     cerr << "Error:" << e.what() << ": " << strerror(errno) << endl; 
    throw; 
    } 
    try{ 
     init.close(); 
    }catch(const ifstream::failure &e){ 
     cerr << "Error:"<< e.what() << ": " << strerror(errno) << endl; 
     throw; 
    } 
} 

int main() 
{ 
    char* buf = new char[72]; 
    try{ 
     OpenFile(buf, sizeof(buf)); 
...