2009-07-04 81 views
0

我知道關於std :: ifstream :: open()有一些問題,但答案並沒有解決我的問題。他們大多數都是特定於Win32的,我使用的是SDL,沒有觸及任何特定於操作系統的功能(......沒有包含到SDL中)。Windows std :: ifstream :: open()問題

問題是:std :: ifstream :: open()似乎不工作了,因爲我已經從Dev-C++切換到Code :: Blocks(我一直在使用相同的MinGW-GCC返回與兩者結束)以及從Windows XP到Vista。 (這也與OS X/Xcode的(GCC後端)完美的作品。)

我的項目針對其來#include <串>,<的iostream >,< fstream的>和<了cassert >靜態庫鏈接,然後調用靜態庫中定義的功能,該功能又調用std :: ifstream :: open()(這次直接)。在此之後,流的計算結果爲false(同時使用隱式布爾轉換運算符和good()方法)。

代碼:

#include "myStaticLibrary.hpp" 

int main(int argc, char **argv) 
{ 
    std::string filename("D:/My projects/Test/test.cfg"); 

    std::cout << "opening '" << filename << "'..." << std::endl; 
    bool success(false); 

    // call to functionality in the static library 
    { 
    std::ifstream infile(filename.c_str()); 
    success = infile.good(); 
    // ... 
    } 
    // success == false; 

    // ... 
    return 0; 
} 

stdcout.txt說:

開放 'd:/我的項目/測試/ test.cfg' ......

當我打開stdcout.txt,並將路徑與文件名複製粘貼到「開始」菜單/運行,該文件被打開,應該是(我不完全確定這是多少診斷值,但也是,地址轉換爲跟隨着g格式:file:/// D:/My%20projects/test/test.cfg)。

我也嘗試用雙反斜槓轉義序列替換'/'(同樣,斜槓之前工作正常),但結果是相同的。

調試版本,但我使用從main()的argv [0]採取的整個絕對路徑。

我在哪裏錯了,我需要做些什麼來解決它?

回答

2

我有監督的重要性事實上,有問題的函數具有close()d流而不檢查它是否是_open()。

它將設置流的fail_bit(導致它評估爲false)的事實對我來說是全新的(這不是它的藉口),我仍然不明白爲什麼此代碼以前工作。

無論如何,C++的參考資料非常清楚;問題現在已經解決了。

2
  1. 請創建一個最小集來重新創建問題。例如,在上面的代碼中,解析了argv和字符串連接,這似乎不是問題的必要部分。最小集合會幫助你(和我們)看到到底發生了什麼問題,而不會被諸如「什麼是GetPath()?」等問題分散注意力。
  2. 嘗試這樣做,而不是assert(infile.good())

    斷言(INFILE);

+0

感謝隱式布爾轉換提示和對信息過多的抱歉(我覺得這是必要的 - 現在我不知道,它是固定的)。我還沒有對所提出的修改進行測試,之後我會回來。 – zyndor 2009-07-04 10:24:29

0

下面的代碼:

#include <string> 
#include <iostream> 
#include <fstream> 
#include <assert.h> 
using namespace std;; 

int main(int argc, char **argv) 
{ 
    std::string filename("D:/My projects/Test/test.cfg"); 
    std::cout << "opening '" << filename << "'..." << std::endl; 
    std::ifstream infile(filename.c_str()); 
    assert(infile.good()); // fails 

    return 0; 
} 

工作正常使用MinGW的G ++ 4.4.0,如果我創建所需的目錄結構我的Windows系統上。文件test.cfg確實存在嗎?如果你打開一個輸入流,如果文件不存在,它將失敗。

編輯:要刪除任何DEVC++到CB問題:

  • 構建使用命令行只
  • 確保你重建靜態庫太
+0

該文件確實存在,我已經在Windows中將其打開,方法是將輸出中的路徑複製到資源管理器中。還有一些其他情況,我沒有澄清試圖保持示例簡單(不知道它們可能會有所作爲 - 再次,代碼與XP/Dev-C++(MinGW-GCC),甚至OS X/xcode(GCC))。我現在編輯原始問題。 – zyndor 2009-07-04 11:10:31