2009-11-12 43 views
2

我試圖打開它,我相信有一個唯一的名稱的輸出文件,但它在一段失敗一次。我找不到任何有關流構造函數失敗原因的信息。爲什麼ofstream將無法在C++中打開文件?原因是什麼?

編輯: 它在某個時間點開始失敗,之後它會一直失敗,直到我停止正在運行的程序寫入該文件。

編輯: 曾經在一段時間= 22-24小時

代碼片段(我不,這將有助於但還是有人問吧)

ofstream theFile(sLocalFile.c_str(), ios::binary | ios::out); 
if (theFile.fail()) 
{ 
    std::string sErr = " failed to open "; 
    sErr += sLocalFile; 
    log_message(sErr); 
    return FILE_OPEN_FAILED; 
} 
+0

「曾經在一段時間。」定義 – Alex 2009-11-12 22:04:13

+10

@windfinder:'while(true){fail();打破; }'。 – 2009-11-12 22:06:56

+0

獨特的名字是什麼意思?你是使用_tmpfile還是其他一些方法來生成一個唯一的文件名?這是用於Windows嗎? – Matt 2009-11-12 22:46:49

回答

10

太多的文件句柄打開?空間不足?拒絕訪問?間歇性網絡驅動器問題?文件已存在?文件被鎖定?沒有更多細節很難說。 編輯:根據您所提供的額外的細節,這聽起來像你可能會泄漏文件句柄(打開文件並沒有關閉它們,因此運行的每個進程的文件句柄限制)。

我假設您熟悉使用exceptions method來控制iostream故障是作爲例外還是作爲狀態標誌進行通信。

在我的經驗中,iostream類給出了什麼問題時,他們的I/O操作過程中發生故障非常小的細節。但是,因爲它們通常使用較低級別的標準C和OS API函數來實現,所以您通常可以獲取底層C或OS錯誤代碼以獲取更多詳細信息。我使用以下功能獲得了好運。

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; 
} 
2

你就出局的空間,或者可能存在許可問題。操作系統可能也鎖定了該文件。嘗試一個不同的名稱/路徑踢,然後看看它是否有效。

+0

嘿斯蒂芬,謝謝。 它在某個時間點開始失敗,然後繼續。直到我停止正在運行的程序寫入這個文件。我會檢查有關空間和權限的問題。 – 2009-11-12 22:09:05

1

一種可能性是您有另一個運行相同程序的實例。

另一個是,也許你運行兩個實例(出於調試的目的?),並且在下一個程序實例出現之前操作系統還沒有完成關閉文件並重置鎖,並要求它。

相關問題