我有以下代碼:讀C++中的流
ifstream initFile;
initFile.open("D:\\InitTLM.csv");
if(initFile.is_open())
{
// Process file
}
該文件是不開放。該文件存在於D:驅動器上。有沒有辦法找出這個文件無法找到的原因?像「errno」一樣?
我有以下代碼:讀C++中的流
ifstream initFile;
initFile.open("D:\\InitTLM.csv");
if(initFile.is_open())
{
// Process file
}
該文件是不開放。該文件存在於D:驅動器上。有沒有辦法找出這個文件無法找到的原因?像「errno」一樣?
你應該能夠使用你的操作系統的底層錯誤報告機制來得到原因(因爲標準庫建立在OS原語上)。該代碼不可移植,但它應該讓你到你的問題的底部。
由於您似乎使用的是Windows,因此您可以使用GetLastError獲取原始代碼,並使用FormatMessage將其轉換爲文本說明。
STL是在報告的錯誤不是很大。這裏是你可以做的最好的標準:
ifstream initFile; initFile.exceptions(ifstream::eofbit|ifstream::failbit|ifstream::badbit); try { initFile.open("D:\\InitTLM.csv"); // Process File } catch(ifstream::failure e) { cout << "Exception opening file:" << e.what() << endl; }
根據我的經驗,由what()返回的消息通常是無用的。
檢查D:驅動器根目錄上的權限。您可能會發現編譯的可執行文件或調試程序正在運行的服務沒有足夠的訪問權限來打開該文件。
嘗試將D:\ root目錄上的權限臨時更改爲「Everyone - > Full Control」,然後查看是否解決了問題。
您可以首先嚐試將InitTLM.csv放入程序目錄,並執行'initfile.open(「inittlm.csv」);'而不是引用驅動器盤符。然後讓我們知道如果錯誤仍然存在。 – JonH 2010-03-22 18:55:24
不要使用'\'作爲seporator,因爲它是轉義字符,所以它會在代碼中增加另一層次的默認值。你的意思是'\\',還是你的意思是'Windows'已經接受'/'作爲自Windows XL以來的目錄服務器。通過使用它,您可以刪除一層我們不需要回答的問題。 – 2010-03-22 20:27:27