2012-09-23 42 views
1

我在Ubuntu 11.04上使用NetBeans 6.9在C++中開發。我已經聲明的輸入和輸出的文件名的字符串和ifstream不創建和打開文件輸出

ifstream fpInputFile, fpOutputFile; 
string inputFileName="", outputFileName=""; 

輸入文件名稱被分配現有文件作爲輸入參數傳遞給應用程序的名稱的文件從而流。除了在最後一段之前插入「_output」之外,輸出文件名與輸入名稱相同。所以輸出被寫入到輸入所在的目錄中。我也開始netbeans與

su netbeans 

所以IDE具有根目錄權限的目錄。我嘗試打開文件,並檢查它們是否被打開。

fpInputFile.open(inputFileName.c_str(), ifstream::in); 
fpOutputFile.open(outputFileName.c_str(), ifstream::out); 
if (!(fpInputFile.is_open())) throw ERROR_OPENING_FILE; 
if (!(fpOutputFile.is_open())) throw ERROR_OPENING_FILE; 

輸入文件成功打開,但輸出文件不成功。

任何幫助確定爲什麼輸出文件不打開寫作將不勝感激。

+2

您知道'ifstream'中的'i'代表輸入,是嗎? – paxdiablo

+0

啊!這是問題所在。我沒有意識到,我代表着投入。我用o代替它,並解決了問題。非常感謝! – OtagoHarbour

回答

3

顯而易見的問題是,您可能打算使用std::ofstream而不是std::ifstream打開文件。這有助於實際寫入流,儘管只要將其打開以供閱讀,就有辦法寫入std::ifstream。例如,您可以直接使用接口std::streambuf或使用std::streambuf構造並使用std::ostream

更有趣的問題是:爲什麼在std::ios_base::in | std::ios_base::out用於打開模式時不打開文件? std::ifstream自動添加std::ios_base::in。事實證明,模式std::ios_base::in | std::ios_base::out不會創建文件,但會成功打開現有文件。如果你真的想使用std::ifstream打開輸出文件,該文件可能不存在,您將需要爲使用std::ios_base::out | std::ios_base::truncstd::ios_base::out | std::ios_base::app

  • 前者將迫使文件創建或截斷,如果它存在
  • 後者將迫使寫入追加到文件中的所有情況下,然而

我個人的猜測是,你是最好的關閉只是使用std::ofstream或者,如果你要打開讀取和寫入文件std::fstream(但是,這也是需要的如果不存在,則添加std::ios_base::truncstd::ios_base::app以創建文件)。

+0

謝謝你的幫助。 – OtagoHarbour

4

聲明輸出文件爲ofstream而不是ifstream

您也可以使用fstream來輸入和輸出文件。

+0

非常感謝。用o替換i解決了問題。再次感謝。 – OtagoHarbour