0

このコードを考えてみましょう:

ifstream filein;

filein.open("y.txt");

この関数を使用するopen()とどうなりますか?

  • ファイルストリーム自体は開かれますか?

  • または、オブジェクトの状態が開いた状態に変わりますか?

  • または両方?

4

4 に答える 4

3

実装の詳細または標準要件を知りたいかどうかは明確ではありませんが、実装の詳細については、オペレーティングシステムの基盤となるオープンシステムコールを呼び出します。たとえばLinuxでは、これはと呼ばれopenます。Windowsでは。と呼ばれCreateFileます。

于 2012-08-27T20:34:22.587 に答える
2

開いているまたは閉じているファイルストリームは、その状態で表されます。したがって、状態をopenに変更すると、ファイルストリームが開いています。出入り口のように。開くと、状態が開いた状態になります。その後、閉じることができます。これには、状態を閉じた位置に変更することが含まれます。状態を開いて開くように変更することと、ストリームを開くことはまったく同じことです。

于 2012-08-27T21:05:54.313 に答える
2

は、から派生したクラスであるstd::ifstreamaを所有するように設定されています。ストリームバッファは、一般的な方法でストリームのバッファリングを管理し、ストリームへのアクセス方法の詳細を抽象化します。基になるストリームの場合、必要に応じてアクセスされるオペレーティングシステムファイルです。が呼び出されると、この呼び出しは主に実際の作業を行う委任先になります。ただし、への呼び出しが成功した場合は状態ビットになり、呼び出しが失敗した場合は設定されます。ファイルバッファは、システムのメソッドを呼び出してファイルハンドルを割り当て、成功した場合は、このファイルハンドルがデストラクタまたは関数(最初に来るもの)で解放されるように調整します。電話するときstd::filebufstd::streambufstd::filebufstd::ifstream::open()std::filebuf::open()std::ifstreamclear()std::filebuf::open()std::ios_base::failbitstd::filebuf::close()std::ifstream::open()デフォルトの引数を使用すると、システムコールはファイルが存在するか、アクセス可能か、開いているファイルハンドルが多すぎないかなどをチェックします。std::ios_base::openmodeいくつかの方法で動作を変更するために使用できるパラメータがあり、呼び出し時に異なるフラグが使用される場合std::ofstream::open()

の呼び出しにstd::filebuf::open()他の効果があるかどうかは、実装次第です。たとえば、実装はバイトのシーケンスを取得してそれらを文字に変換することを選択できます。ユーザーは特定の設定、特にstd::localestd::streambuf::pubimbue()関数を参照)をオーバーライドできるため、最初の読み取りの前に多くのことが発生する可能性はほとんどありません。いずれの場合も、ファイル自体を開いた後の操作の結果によって、状態フラグが影響を受けることはありません。

ところで、言及されたクラスは実際にはすべてのテンプレート(、、、、std::basic_ifstreamおよび)でありstd::basic_filebuf、文字タイプとして機能するインスタンス化のために上記で使用された名前に変換されます。で動作するインスタンス化にプレフィックスを使用する同様のがあります。興味深いことに、バージョンとバージョンにはsがなく、それらをインスタンス化するのも少し手間がかかるようです。std::basic_streambufstd::basic_ofstreamtypedefchartypedefwwchar_ttypedefchar16_tchar32_t

于 2012-08-27T21:17:09.697 に答える
1

論理的に考えると、ifstreamは、ファイルの内容を取得するストリームにすぎません。ifstream.open()に提供するパラメーターは、ファイルを開き、開いているとマークします。ファイルがオープンとしてマークされている場合、プログラムによって開かれているファイルの名前を変更するなど、ファイルに対して一部の操作を実行することはできません。ストリームを閉じた後も同じことができます。ifstream --imoは、ファイルにアクセスするための唯一のヘルパークラスです。

于 2012-08-27T20:50:22.107 に答える