CreateFile
対fopen
対ofsteam
- 有利&不利益?CreateFileとSteamの利点と欠点の比較
パワフルだがWindows用のCreateFileだと聞いた。
(Windows上で)何を使用すればよいのか、その理由を教えてください。
CreateFile
対fopen
対ofsteam
- 有利&不利益?CreateFileとSteamの利点と欠点の比較
パワフルだがWindows用のCreateFileだと聞いた。
(Windows上で)何を使用すればよいのか、その理由を教えてください。
あなたの仕事によって異なります。テキストファイルを連続的に読み書きするために、iostreamは間違いなく道のりです。トランザクションセキュリティや非標準デバイスに関するものは、システムに直接アクセスする必要があります(CreateFile
またはopen
)。それでも、テキストのシーケンシャル読み込みと書き込みのために、最善の解決策は、streambuf
独自に定義する、とのiostreamとそれを使用することです。
fopen
が好ましいと思われる文脈は考えられません。
ほとんどの場合、C++ではfopenを、C++ではofstreamを使用する方がよいでしょう。 CreateFileは、共有とキャッシングをさらに制御しますが、書式設定機能は提供しません。
したがって、 'CreateFile'を使う必要がある方法で' streambuf'を書いて、両方の利点を得ることができます。 –
私はいつも、IOstreamに新しいソースや宛先を接続するのはとても面倒です。もしあれば、C++はデータライター/リーダにとって純粋な抽象クラスを宣言するのを容易にします。 –
あなたは、Windowsのファイル機能によって提供される機能は、(例えばI/Oをオーバーラップ)が必要なければ、その後、私の提案は、よりポータブルであることに加えC.
でC++またはFILE
(fopen
や友人)で入出力ストリームのいずれかで起こっています書式付きの入出力をテキストファイルに使用することもできます.C++では、クラスの出力/入力演算子を簡単にオーバーロードできます。
'std :: streambuf'といくつかの特別な機能(トランザクションの完全性、特殊デバイス、など)。 –
OS API関数(CreateFile
など)によって提供される特別な機能が無条件に必要な場合を除き、標準ライブラリ関数(fopen
またはofstream
など)を使用することをお勧めします。あなたのプログラムはよりポータブルになります。
私はI/Oと、おそらくより細かい粒度のアクセス権を重複していると考えることができCreateFile
を使用しての唯一の本当の利点。
あなたは、Windowsのファイルメモリマッピングを使用する場合は、CreateFile
を使用する必要がありますに(CreateFileMapping APIに渡された、例えばHANDLE
がCreateFile
の戻り値です)。また、CreateFile
は、CおよびC++標準のファイルAPIよりも高いカスタマイズオプションを提供しています。
移植コードを書く場合、またはWindows固有の機能が必要ない場合は、CおよびC++の標準ファイルAPIは問題ありません。大きなデータを処理する際にいくつかのテストで は、私はC++ I/Oは、生のCファイルAPI対ストリームのいくつかのパフォーマンス・オーバーヘッドを指摘しました。あなたはこのようなケースであることが起こるならば、あなたは、単にいくつかのC++ RAIIクラスの生のCファイルのAPIをラップし、まだC++のコードでそれを使用することができます。
私は4GBから10GB +までの大容量データファイルとmemマッピングを必要とします。 – Eveler
メモリマッピングが必要な場合は、Direct Win32 API呼び出しを使用してC++ RAIIクラスでラップすることができます。 –
私は
私をエスケープ何らかの理由で閉鎖されたfopen or CreateFile in Windows
から私の答えをコピーし...
結論:
これらの小さなタスクについて怖がってはいけません。あなたは実際にあなたのコードで起こっていることを知っているでしょうし、これらの小さなコードはそれを呼び出すコードに比べて(コード行の量で)無視してください。また、RAIIをすべて使用している場合、これらのユーティリティクラスを呼び出すコードは、RAIIを使用していない場合と比べて大幅に少なくなり、2段階以上の初期化を行い、これらのユーティリティクラスを他のOS用の等価なユーティリティクラスに置き換えることも、子プレイ(UNIXではopen()/ close()/ read()/ write()を使用)です。
そして、前の千年のために、Googleのプログラミングガイドラインを読んではいけません!
私は力をしたい:)バイナリを書いて読んでください。私は開いていると聞いて、ファイルを作成するのには合わないのですか?これは本当ですか? – Eveler
@Eveler:完全なパワーを望むなら、ファイルを処理するのに最も速いのは、[CreateFileMapping]を使ってファイルを開き、CreateFileMappingでメモリにマップすることです(http: //blogs.msdn.com/b/oldnewthing/archive/2005/05/13/417183.aspx)、[標準C++]から始まる最適化シリーズの一部です(http://blogs.msdn.com/ b/oldnewthing/archive/2005/05/10/415991.aspx)、次に[Win32 optimized code]に移動します(http://blogs.msdn.com/b/oldnewthing/archive/2005/05/19/420038 .aspx)。しかし、ほとんどの場合、単純な標準CとC++はOKです。 –
'fopen'は上位レベルの関数で、C++では' fstream :: open'に置き換えられました。 'CreateFile'と' open'はシステムレベルの関数で、Windowsでは最初の関数、Unixでは2番目の関数です。システムは異なる機能を別々にサポートしているため、まったく同じものを提供するわけではありません。 –