[英]What does ifstream::open() really do?
考慮以下代碼:
ifstream filein;
filein.open("y.txt");
當我使用open()
函數時,會發生什么?
文件流本身會打開嗎?
還是對象的狀態更改為打開?
或兩者?
目前尚不清楚您是否想知道實現細節或標准要求-但對於實現細節-它會在操作系統上調用底層的開放系統調用。 例如,在Linux上,這稱為open
。 在Windows上,它稱為CreateFile
。
被打開或關閉的文件流由其狀態表示。 因此,如果將狀態更改為打開,則文件流現在已打開。 就像門口。 如果您打開它,則已將其狀態更改為打開位置。 然后您可以稍后將其關閉,這涉及將其狀態更改為關閉位置。 更改其狀態以打開和打開流是完全相同的事情。
將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_ifstream
, std::basic_filebuf
, std::basic_streambuf
和std::basic_ofstream
),這是typedef
“版上面的實例在工作中使用的名稱char
一個字符類型。 類似的typedef
使用w
前綴進行wchar_t
實例化。 有趣的是,對於char16_t
和char32_t
版本,沒有typedef
,並且似乎也需要實例化它們。
如果您從邏輯上考慮,ifstream只是我們將在其中獲取文件內容的流。 我們提供給ifstream.open()的參數將打開文件並將其標記為打開。 當文件被標記為打開時,它將不允許您對文件進行某些操作,例如重命名文件,因為它是由某個程序打開的。 關閉流后,它將允許您執行相同的操作。 ifstream-imo只是訪問文件的幫助程序類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.