2011-03-16 5 views
1
  • fopen_s < - >のOpenFile
  • fcloseを< - > CLOSEFILE

は私の仮定が正しいですか?いくつかのファイルI/O C++のlib関数の代わりのDelphi?

OpenFileまたはCreateFileを使用する方が良いと思います。後者は自由度が増しますが、速くなりますか?

+0

問題を指定できますか?はい、これらの関数(C++とその同等の機能)は同様のことを行います。パフォーマンスは、あなたが解決する問題に依存し、彼らは対応するwinapiシステムコールに変換する、彼らの(OpenFile、CreateFile)の動作が異なります。 – vissi

+0

@vissiが間違っているのを恐れています。下の私の答えを見てください。 –

+0

あなたは、デルファイのストリームがより適しているという意味ですか?はい、しかし、C言語のストリームに似ています( '')、Cスタイルの構造体ではなく、winapi形式の呼び出しも使用できます。 – vissi

答えて

3

私はどちらもDelphiで使用しません。ストリームを使用します。低レベルのファイル処理は面倒でエラーが起こりやすいので、可能であれば高水準のルーチンを使用する方がはるかに優れています。

どちらが速いかは、OpenFileまたはCreateFileです。それらは基本的に同じですが、ファイルを開く方法はシステムコールにマップされるので、パフォーマンスはどのようにしても同じになります。さらに、ファイルを開くためのパフォーマンスが重要なときは、その時間を読み書きするときに費やされます。

パフォーマンスに関する質問は、文脈なしでは答えにくいです。何千もの小さなテキストファイルを読み込むアプリケーションの答えは、例えば、テープドライブへのバックアップをストリーミングするものとは異なります。

とにかく、私の元のポイントを強調するために、Delphiが提供する優れた高水準フレームワークを利用し、ストリームを使用し、低レベルのI/Oを避けてお楽しみください!


どのようにしてDelphiストリームを使用しますか?文字列でテキストをファイルに書き込む例を使って説明しようとします。

procedure SaveTextToFile(FileName, Text: string); 
var 
    Stream: TFileStream; 
begin 
    Stream := TFileStream.Create(FileName, fmCreate); 
    Try 
    if Length(Text)>0 then 
     Stream.WriteBuffer(Text[1], Length(Text)*SizeOf(Char)); 
    Finally 
    Stream.Free; 
    End; 
end; 

かなりわかりやすいです。 TFileStreamコンストラクタの2番目のパラメータは、ファイルモードを決定します。ここでは、新しいファイルを作成したいので、コンテンツがあれば削除されます。このパラメータでファイル共有を指定することもできます。

バッファを書き出すコードは少しボイラープレートがありますが、やはり非常に簡単です。

ほぼ同じルーチンで結果をバックロード:

function LoadTextFromFile(FileName: string): string; 
var 
    Stream: TFileStream; 
begin 
    Stream := TFileStream.Create(FileName, fmOpenRead); 
    Try 
    SetLength(Result, Stream.Size div SizeOf(Char)); 
    if Length(Result)>0 then 
     Stream.ReadBuffer(Result[1], Length(Result)*SizeOf(Char)); 
    Finally 
    Stream.Free; 
    End; 
end; 

ファイルの周りに模索したいならば、あなたは、ストリームのPositionプロパティを設定、またはSeek()メソッドを呼び出すことができます。後者の利点は、現在の位置または終了位置からシークできることです。

ストリームは慣用的なDelphiです。これらは、RTLおよびVCLやサードパーティのライブラリで広く使用されています。それらは、ネイティブのDelphiの方法で例外を含むエラーを通知します。共通の祖先からすべて派生し、多くのルーチンがこの共通の祖先を受け入れる多くの異なるストリームクラスがあります。

+0

もちろん、* OpenFileの *と* 'CreateFile'の両方がWindows APIの関数であるという事実を知っていますか? –

+0

正確に。 「私が今知っているこの手続き型の非OOP関数に最も近い関数」よりも質問が「Delphi RTLを使用する正しい方法と、クラスが提供されている場合は何か」という質問をしてくださいストリームベースの手続き型APIではなくStreamクラスを使用します。 –

+0

ありがとうございます。ストリームを使う方法はわかりませんが、代わりにメモリマップされたファイルについて学びたいと思っていました。決して見たことはない。とにかく、私はストリームを使いました。 – pop32

3

低レベルのDelphiファイルの取り扱いは、次のように行われます。

procedure Proc; 
var 
    f: file; // or f: TextFile; 
begin 
    FileMode := fmOpenRead; // or fmOpenWrite or fmOpenReadWrite 
    AssignFile(f, 'C:\file.txt'); 
    try 
    // Reset/Rewrite 
    // A number of BlockRead/BlockWrite/ReadLn/WriteLn... 
    finally 
    CloseFile(f); 
    end; 
end; 

これは、Delphiでファイルを扱うの古典的な方法であり、これはC++の機能に対応するものです。

OpenFileCreateFileない Delphiの関数であるので、それらはC++関数に対応することができません。代わりに、これらはWindows APIの関数であり、すべて(Windows)プログラミング言語で利用できます。前者のOpenFileはお勧めしません。代わりにCreateFileを使用してください。しかし、Windows APIファイル処理関数を使用してファイルを開いたり作成したりする場合は、ファイルを読み書きするためにもこれらを使用する必要があります。 ReadFile関数を使用し、CloseHandle関数を使用して終了する必要があります。

特にOpenFileはWindows APIの機能ですが、CloseFileはDelphi RTL関数なので、これらを一緒に使用することはできません。 Delphi:AssignFile - >CloseFile; Windows API:CreateFile - >CloseHandle

さらに、の高レベルファイルがDelphi RTL(ランタイムライブラリ)で管理されていることがわかります。私は他のユーザーがこれらを促進すると確信しています。

+0

これは、「古典的」ではなく、ファイルを扱うための「パスカル」方法です。コンソールアプリケーションでは適切ですが、VCLアプリケーションでは避ける必要があります。 – kludg

+2

@Serg:低レベル/高レベルのものについては議論しませんが、GUI /コンソールの区別がファイルの読み書き方法と何か関係があるのはなぜですか? –

+0

コンソールアプリケーションでさえ避けるべきです。 –

2

私はDelphiのプログラミングを行って以来、ずっとずっと続いていましたが、ファイルIOはTStreamクラスのクラス(ファイルIO用のTFileStream)を使用する方がはるかに優れていたことを覚えています。基本的には、C++のIOストリームライブラリと同等のメカニズムですが、もちろん、C++でファイルIOを実行するための好ましい方法です。 this simple exampleおよびwikiを参照してください。

+0

私はそう言わなかったのですか? ;) –

+0

@ANdreas。並べ替えあなたはそれらが存在すると言います。 Davidは実際にそれらの名前を付けます。 –

関連する問題