2012-08-27 39 views
0

考慮以下代碼:當我使用open()功能ifstream :: open()真的做什麼?

ifstream filein; 

filein.open("y.txt"); 

,會發生什麼?

  • 文件流本身是否打開?

  • 還是對象的狀態改變打開?

  • 或兩者兼而有之?

+0

http://en.cppreference.com/w/cpp/io/basic_ifstream/open? – rve

回答

2

正在打開或關閉的文件流由其狀態表示。因此,如果您將狀態更改爲打開,則文件流現在已打開。像門口一樣。如果你打開它,你已經改變它的狀態到開放的位置。然後您可以稍後關閉它,這涉及將其狀態更改爲關閉位置。改變它的狀態來打開和打開流是完全一樣的。

3

您不清楚您是否想知道實現細節或標準需求 - 但至於實現細節 - 它將調用操作系統上的底層開放系統調用。例如在Linux上,這稱爲open。在Windows上,它被稱爲CreateFile

1

如果您在邏輯上思考,ifstream就是我們將獲取文件內容的流。我們提供給ifstream.open()的參數將打開文件並將其標記爲打開。當文件被標記爲打開時,它不會允許您在文件上執行一些操作,如某些程序打開文件時重命名文件。它可以讓你在關閉流後做同樣的事情。 ifstream - imo只是幫助程序類來訪問文件。

2

std::ifstream設置爲擁有std::filebuf這是從std::streambuf派生的類。流緩衝區以通用方式管理流的緩衝,並抽象流的訪問細節。對於std::filebuf,底層流是根據需要訪問的操作系統文件。當調用std::ifstream::open()時,該呼叫主要委託給std::filebuf::open(),該實際工作完成。但是,如果呼叫std::filebuf::open()成功,則std::ifstream將其狀態位設爲clear(),如果呼叫失敗,則設置std::ios_base::failbit。文件緩衝區將調用系統的方法來分配一個文件句柄,如果成功的話,可以安排這個文件句柄在其析構函數或std::filebuf::close()函數中釋放 - 無論它來自何處。當使用缺省參數調用std::ifstream::open()時,系統調用將檢查文件是否存在,是否可訪問,是否打開太多文件句柄等。有一個參數std::ios_base::openmode,它可用於以某些方式修改行爲,並在不同標誌在撥打std::ofstream::open()時使用。

是否對std::filebuf::open()的呼叫有任何其他影響取決於實施。例如,實現可以選擇獲取一系列字節並將它們轉換爲字符。由於用戶可以覆蓋某些設置,特別是std::locale(請參見std::streambuf::pubimbue()函數),但在第一次讀取之前不太可能發生這種情況。在任何情況下,打開文件本身後,任何操作的結果都不會影響任何狀態標誌。

順便說一句,在提到的類實際上是所有的模板(std::basic_ifstreamstd::basic_filebufstd::basic_streambuf,和std::basic_ofstream),它們是typedef「ED上述用於實例化上char工作作爲一個字符類型中使用的名稱。有類似的typedef s使用w前綴用於在wchar_t上工作的實例。有趣的是,char16_tchar32_t版本沒有typedef s,它似乎也有點工作讓它們實例化。