テキストファイルの読み込みにおけるファイルモードはどちらが正しいのでしょうか?

解決


ミネ  2008-05-25 02:40:14  No: 100743

テキストファイルを読み込む下の関数のOpen文のところで、
ファイルモードが「For Binary Access Read」のときと「For Input」のときとで、
約40倍も読み込みスピードが違いました。
InputBで読み込むのだから「For Binary」でオープンしないといけないと思っていたので、
ずっと前者の方を使っていたのですが、後者の方を遣うべきなのでしょうか?
読み込まれた内容は同じようなのですが、ひっとしてたまたま同じだっただけで、場合によっては違う内容になってしまうというよことはあるのでしょうか?
また、なぜこんなに速さが違うのでしょうか?バイナリの方が速そうな気がするのにその逆だというのが不思議です。
よろしくお願いします。

Public Function ReadTextFile(MyFileName As String) As String

    Dim MyFileNo As Integer
    
    MyFileSize = FileLen(MyFileName)
    
    MyFileNo = FreeFile
    
'    Open MyFileName For Binary Access Read As #MyFileNo '← この方法だと40倍くらい遅い。
    Open MyFileName For Input As #MyFileNo '← この方法だと速い。
        ReadTextFile = InputB(MyFileSize, #MyFileNo)
    Close #MyFileNo
    
    ReadTextFile = StrConv(ReadTextFile, vbUnicode)

End Function


  2008-05-26 20:42:19  No: 100744

ちと調べてみたけど、Binaryモードだと1バイトずつデータを取得する、って説明してるページがあった
http://homepage2.nifty.com/kasayan/vba/binary.htm
(そもそもBinaryを扱うならByte型の配列を使って読み書きする事が殆どな気もするが…)
推測だけど、そのせいで遅くなってる気がする
あと、ヘルプ見たらBinaryモードでPutする時は書き込み位置を指定できるっぽいんで
その辺の絡みもあるのかも

一応、ヘルプにInputまたはBinaryでOpenしてInput(INputB)で取得云々と書いてる部分もあるから
別に使ってはまずい、という事は無いと思う
InputBを使ってるのは、本当ならInputでやりたかったけど文字数なんか分からないから
仕方なくInputBを使ったって感じかと


ミネ  2008-05-28 06:49:58  No: 100745

> Binaryモードだと1バイトずつデータを取得する
なるほど、それで遅かったんですね。

これで安心して For Input で開くことができます。
いろいろ勉強になりました。
ありがとうございました。


ミネ  2008-05-28 06:51:29  No: 100746

失礼しました。
「解決」のチェックを忘れてました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加