簡體   English   中英

ifstream :: open()的作用是什么?

[英]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::ifstreamclear()其狀態位,如果調用失敗,則設置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_streambufstd::basic_ofstream ),這是typedef “版上面的實例在工作中使用的名稱char一個字符類型。 類似的typedef使用w前綴進行wchar_t實例化。 有趣的是,對於char16_tchar32_t版本,沒有typedef ,並且似乎也需要實例化它們。

如果您從邏輯上考慮,ifstream只是我們將在其中獲取文件內容的流。 我們提供給ifstream.open()的參數將打開文件並將其標記為打開。 當文件被標記為打開時,它將不允許您對文件進行某些操作,例如重命名文件,因為它是由某個程序打開的。 關閉流后,它將允許您執行相同的操作。 ifstream-imo只是訪問文件的幫助程序類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM