2013-04-03 63 views
2

我一直有奇怪的問題寫有ofstreams到文件,現在有C++調試ofstream失敗()狀態?

ofstream.fail() 

是我ofstream.open()調用後返回true權。

是否有一些獲取附加信息的方法,例如關於爲什麼設置失敗狀態的更多細節?

編輯,附加信息:is_open()返回false。

+0

是什麼'IS_OPEN()'說什麼? – jrok

+0

is_open()返回false。 – user788171

+0

據此.. http://www.cplusplus.com/reference/ios/ios/fail/我猜這個函數不會幫你挖掘失敗的真正原因... –

回答

0
io_state word=ofstream.rdstate(); 
if(word & ios::failbit){ 
    cout<<"Failbit flag is set"; 
} 
//etc 
1

確保ofstream沒有與它已經相關的文件(打開與流的文件的話)。根據http://www.cplusplus.com/reference/fstream/ofstream/open/

如果對象已經有一個文件關聯(打開),則該函數將失敗。 失敗時,將設置失敗位標誌(可以使用成員失敗進行檢查),並根據異常設置的值來拋出異常。

如果您打開了一個文件,請在打開之前將其關閉。

編輯:如上圖所示,你可以檢查哪些'failbit flag通過使用stream.rdstate()

1

剛剛設定發現了同樣的情況,我決定,讀過

如果(outfile.is_open一個錯字()! );

{

}

的,如果statment後沒有注意到分號...

0

報價this

std::string DescribeIosFailure(const std::ios& stream) 
{ 
    std::string result; 

    if (stream.eof()) { 
    result = "Unexpected end of file."; 
    } 

#ifdef WIN32 
    // GetLastError() gives more details than errno. 
    else if (GetLastError() != 0) { 
    result = FormatSystemMessage(GetLastError()); 
    } 
#endif 

    else if (errno) { 
#if defined(__unix__) 
    // We use strerror_r because it's threadsafe. 
    // GNU's strerror_r returns a string and may ignore buffer completely. 
    char buffer[255]; 
    result = std::string(strerror_r(errno, buffer, sizeof(buffer))); 
#else 
    result = std::string(strerror(errno)); 
#endif 
    } 

    else { 
    result = "Unknown file error."; 
    } 

    boost::trim_right(result); // from Boost String Algorithms library 
    return result; 
}