このコードを考えてみましょう:
ifstream filein;
filein.open("y.txt");
この関数を使用するopen()
とどうなりますか?
ファイルストリーム自体は開かれますか?
または、オブジェクトの状態が開いた状態に変わりますか?
または両方?
このコードを考えてみましょう:
ifstream filein;
filein.open("y.txt");
この関数を使用するopen()
とどうなりますか?
ファイルストリーム自体は開かれますか?
または、オブジェクトの状態が開いた状態に変わりますか?
または両方?
実装の詳細または標準要件を知りたいかどうかは明確ではありませんが、実装の詳細については、オペレーティングシステムの基盤となるオープンシステムコールを呼び出します。たとえばLinuxでは、これはと呼ばれopen
ます。Windowsでは。と呼ばれCreateFile
ます。
開いているまたは閉じているファイルストリームは、その状態で表されます。したがって、状態をopenに変更すると、ファイルストリームが開いています。出入り口のように。開くと、状態が開いた状態になります。その後、閉じることができます。これには、状態を閉じた位置に変更することが含まれます。状態を開いて開くように変更することと、ストリームを開くことはまったく同じことです。
は、から派生したクラスであるstd::ifstream
aを所有するように設定されています。ストリームバッファは、一般的な方法でストリームのバッファリングを管理し、ストリームへのアクセス方法の詳細を抽象化します。基になるストリームの場合、必要に応じてアクセスされるオペレーティングシステムファイルです。が呼び出されると、この呼び出しは主に実際の作業を行う委任先になります。ただし、への呼び出しが成功した場合は状態ビットになり、呼び出しが失敗した場合は設定されます。ファイルバッファは、システムのメソッドを呼び出してファイルハンドルを割り当て、成功した場合は、このファイルハンドルがデストラクタまたは関数(最初に来るもの)で解放されるように調整します。電話するときstd::filebuf
std::streambuf
std::filebuf
std::ifstream::open()
std::filebuf::open()
std::ifstream
clear()
std::filebuf::open()
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
、文字タイプとして機能するインスタンス化のために上記で使用された名前に変換されます。で動作するインスタンス化にプレフィックスを使用する同様のがあります。興味深いことに、バージョンとバージョンにはsがなく、それらをインスタンス化するのも少し手間がかかるようです。std::basic_streambuf
std::basic_ofstream
typedef
char
typedef
w
wchar_t
typedef
char16_t
char32_t
論理的に考えると、ifstreamは、ファイルの内容を取得するストリームにすぎません。ifstream.open()に提供するパラメーターは、ファイルを開き、開いているとマークします。ファイルがオープンとしてマークされている場合、プログラムによって開かれているファイルの名前を変更するなど、ファイルに対して一部の操作を実行することはできません。ストリームを閉じた後も同じことができます。ifstream --imoは、ファイルにアクセスするための唯一のヘルパークラスです。